首页 > 解决方案 > Python Regex:美国电话号码解析

问题描述

我是正则表达式的新手。

我需要将不同格式的美国电话号码解析为 3 个字符串:区号(没有“()”),接下来的 3 位数字,最后 4 位数字。不 '-'。

我还需要拒绝(消息错误):

916-111-1111(区号后的“-”)(916)111 -1111(“-”前的空格)(916)111-1111(区号内的任何空格)-(916)-必须拒绝也

(a56)111-1111(区号内的任何非数字)

区号缺少“()”

它应该没问题:'(916)111-1111'(除上述之外的任何地方的空格)

这是我的正则表达式:

^\s*\(?(\d{3})[\)\-][\s]*?(\d{3})[-]?(\d{4})\s*$

这花了我2天时间。

它没有失败 916-111-1111(区号后有“-”的可用性)。我敢肯定还有其他一些不足之处。

非常感谢您的帮助。甚至暗示。

有效的:

'(916) 111-1111'
'(916)111-1111     '
'   (916)      111-1111'

无效的:

'916-111-1111' - no () or '-' after area code
'(916)111 -1111' - no space before '-'
'( 916)111-1111' - no space inside ()
'(abc) 111-11i1' because of non-digits

标签: pythonregexparsing

解决方案


你可以这样做:

import re
r = r'\((\d{3})\)\s*?(\d{3})\-(\d{4,5})'
l = ['(916) 111-11111', '(916)111-1111     ', '   (916)      111-1111', '916-111-1111', '(916)111 -1111', '( 916)111-1111', '(abc) 111-11i1']
print([re.findall(r, x) for x in l])

# [[('916', '111', '11111')], [('916', '111', '1111')], [('916', '111', '1111')], [], [], [], []]

推荐阅读