用于匹配电话号码的Python正则表达式

用于匹配电话号码的Python正则表达式,python,regex,Python,Regex,我是Python正则表达式的新手,我需要你的帮助。 我使用以下正则表达式匹配电话号码: r'^\s*\(?([0-9]{3})[\)\-][\s]*?([0-9]{3})[-]?([0-9]{4})\s*$' 令人欣慰的是,它确实通过了大多数情况,但它并没有失败的一些格式。 有人能澄清我做错了什么吗? 我猜数字第一部分的空格和括号格式有问题 它应该传递这些格式 '(404) 666-1111' '(404) 6661111' '404-666-1111' '404-6661111' '4046

我是Python正则表达式的新手,我需要你的帮助。 我使用以下正则表达式匹配电话号码:

r'^\s*\(?([0-9]{3})[\)\-][\s]*?([0-9]{3})[-]?([0-9]{4})\s*$'
令人欣慰的是,它确实通过了大多数情况,但它并没有失败的一些格式。 有人能澄清我做错了什么吗? 我猜数字第一部分的空格和括号格式有问题

它应该传递这些格式

'(404) 666-1111'
'(404) 6661111'
'404-666-1111'
'404-6661111'
'404666-1111'
'4046661111'
'  (404)   666-1111  '
'(404)666-1111  '
'  404-666-1111 '
'  404-6661111 '
' 4046661111'
并在以下方面失败:

'+1 (404) 666-1111'
' ( 404)666-1111'
'404.666.1111'
'404 666-1111'
'404 666 1111'
'(404-666-1111'

关键的挑战是确保括号匹配。鉴于正则表达式不能计算开始和结束符,通常的方法是提供两种可选模式,一种带括号,另一种不带括号:

>>> bool(re.match(r'(\(\d{3}\))|\d{3}', '404'))
True
>>> bool(re.match(r'(\(\d{3}\))|\d{3}', '(404)'))
True
>>> bool(re.match(r'(\(\d{3}\))|\d{3}', '(404'))
False

你能做的就是摆脱它,然后用regex试试|它的意思是或 请注意,此正则表达式不完整,但ide允许您在其中添加更多内容:

import re
numbersList=['(404) 666-1111' ,'(404) 6661111', '404-666-1111', '404-6661111' ,'404666-1111', '4046661111', '  (404)   666-1111  ' ,'(404)666-1111  ' ,'  404-666-1111 ', '  404-6661111 ', ' 4046661111' ]
regExStr="^\(\d{3}\) *\d+\-*\d+|^ *\d+\-\d+|^ *\d+|^ *\(\d{3}\)\d+\-\d+"
for number in numbersList:
    tmpStr=number.replace(" ", "")
    result = re.findall(regExStr, tmpStr)
    print(result)
    print("orig: " + number)

没有任何括号或连字符的整数不匹配的原因是,在模式的开头,在3位数字之后有一个或-期望值

要匹配和不匹配所有示例,可以使用

 ^\s*(?:\(\d{3}\)\s*|\d{3})-?\d{3}-?\d{4}\s*$
解释

^字符串开头 \s*匹配0+空格字符 ?:非捕获组 \\d{3}\\s*在括号和可选空白字符之间匹配3位数字 |或 \d{3}匹配3位数字 近群 -?\d{3}-?在可选连字符之间匹配3位数字 \d{4}\s*匹配4位数字和可选空白字符 $字符串结尾 请注意\s还可以匹配换行符

,使用此选项可以帮助您了解什么是匹配还是不匹配,正如@RaymondHettinger所说的,使用交替代替?
 ^\s*(?:\(\d{3}\)\s*|\d{3})-?\d{3}-?\d{4}\s*$