无法捕获具有不同模式的某些电话号码

时间:2017-11-29 17:32:48

标签: python regex python-3.x

应该使用适当的正则表达式来捕获下面列出的所有电话号码?我试过一个,它部分完成了工作。但是,我想把它们全部搞定。感谢您的任何建议或帮助。

以下是我尝试过的剧本编号:

import re

content='''  
415-555-1234
650-555-2345
(416)555-3456
202 555 4567
4035555678
1 416 555 9292
+1 416 555 9292
'''
for phone in re.findall(r'\+?1?\s?\(?\d*\)?[\s-]\d*[\s-]\d*',content):
  print(phone)

我得到的结果是:

415
-555-1234

650-555-2345
555-3456
202
 555 4567
4035555678

1 416 555
 9292

+1 416 555 9292

2 个答案:

答案 0 :(得分:3)

我建议强制使用正则表达式的某些部分(比如数字模式,将*替换为+),或者它可能与文本的无意义部分相匹配。另请注意,\s匹配任何空格,而您最有可能希望匹配相同行上的字符串。

您可以尝试

\+?1? ?(?:\(?\d+\)?)?(?:[ -]?\d+){1,2}

请参阅regex demo

<强>详情

  • \+? - 可选加
  • 1? - 可选的1
  • ? - 和可选空间
  • (?:\(?\d+\)?)? - (的可选序列,然后是1位数字,然后是可选的)
  • (?:[ -]?\d+){1,2} - 1或2次出现:
    • [ -]? - 可选空格或-
    • \d+ - 1+位数

答案 1 :(得分:2)

我认为这个regx适合您的情况

import re
content = '''  
    415-555-1234
    650-555-2345
    (416)555-3456
    202 555 4567
    4035555678
    1 416 555 9292
    +1 416 555 9292
    '''
    for phone in re.findall(r'(([+]?\d\s\d?)?\d{3}[-\.\s]??\d{3}[-\.\s]??\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]??\d{4}|\d{3}[-\.\s]??\d{4})', content):
        print phone[0]