匹配电话号码,正则表达式

时间:2016-03-10 17:00:15

标签: python regex

我有这种格式的电话号码:

 some_text   phone_number some_text
 some_text   (888) 501-7526 some_text

这是一种搜索电话号码的更加pythonic方式

(\(\d\d\d\) \d\d\d-\d\d\d\d)

(\([0-9]+\) [0-9]+-[0-9]+)

或者有一个更简单的表达来做到这一点?

3 个答案:

答案 0 :(得分:6)

我认为你正在寻找这样的东西:

(\(\d{3}\) \d{3}-\d{4})

来自Python docs

  

{M}

     

指定前一个RE应该是m个副本   匹配;较少的匹配导致整个RE不匹配。例如,   {6}将匹配六个'a'个字符,但不匹配五个。

(\(\d\d\d\) \d\d\d-\d\d\d\d)也可以,但正如你在问题中所说的那样,它是相当重复的。您的其他建议模式(\([0-9]+\) [0-9]+-[0-9]+)会对输入提供误报,例如(1) 2-3

答案 1 :(得分:3)

使用(\(\d{3}\)\s*\d{3}-\d{4})

>>> import re
>>> s = "some_text   (888) 501-7526 some_text"
>>> pat = re.compile(r'(\(\d{3}\)\s*\d{3}-\d{4})')
>>> pat.search(s).group() 
'(888) 501-7526'

Demo

说明:

  • (\(\d{3}\)\s*\d{3}-\d{4})/
    • 第一个捕获小组(\(\d{3}\)\s*\d{3}-\d{4})
      • \(字面匹配字符(
      • \d{3}匹配数字[0-9]
        • 量词:{3}正好3次
      • \)字面匹配字符)
      • \s*匹配任何空格字符[\r\n\t\f ]
        • 量词:*在零和无限次之间,尽可能多次,根据需要回馈[贪婪]
      • \d{3}匹配数字[0-9] 量词:{3}恰好3次
      • -匹配字符 - 字面意思
      • \d{4}匹配数字[0-9] 量词:{4}恰好4次

答案 2 :(得分:0)

我认为第二种方式是更加pythonic的方式。上面的那个并不容易阅读,但正则表达式根本就不那么直观。

如果未指定电话号码的长度,

(\([0-9]+\) [0-9]+-[0-9]+)将执行此操作。如果长度始终相同,则可以使用(\([0-9]{3}\) [0-9]{3}-[0-9]{4})(\(\d{3}\) \d{3}-\d{4})