用于匹配电话号码的Python正则表达式
我是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
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*$