[英]Python regex for matching phone numbers
我是 Python regex 的新手,我需要你的帮助。 我正在使用以下正则表达式来匹配电话号码:
r'^\s*\(?([0-9]{3})[\)\-][\s]*?([0-9]{3})[-]?([0-9]{4})\s*$'
Apprantly 它确实通过了大多数情况,但它不会使某些格式失败。 有人可以澄清我做错了什么吗? 我猜数字的第一部分中的空格和括号格式有问题。
它应该通过这些格式
'(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
没有任何括号或连字符的整数不匹配的原因是因为在模式的开头,在 3 位数字之后有一个)
或-
预期
^\s*\(?([0-9]{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
也可以匹配换行符
你可以做的是摆脱“”然后用“|”做正则表达式这意味着或请注意,这个 RegEx 是不完整的,但想法是您可以添加更多 | 对此:
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.