繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM