用于将手机与分隔符匹配的Python正则表达式

时间:2016-04-10 23:45:57

标签: python regex

此正则表达式应匹配带或不带分隔符的电话号码:

phonePattern = re.compile(r'^(\d{3})\D*(\d{3})\D+(\d{4})\D*(\d*)$')

适用于这样的电话号码:800-555-1212-1234,但如果是80055512121234,则仍然无法匹配。

即使我使用*来表示零个或多个非空白字符。

2 个答案:

答案 0 :(得分:4)

您的正则表达式中包含\D+一个或多个非数字)。此外,您不希望有零个或多个分隔符。你想要完全单一或没有分隔符,所以:

^(\d{3})\D?(\d{3})\D?(\d{4})\D?(\d*)$

无论如何,如果您不想匹配-之类的内容,我会使用\D代替非数字(123a456b7890c):

^(\d{3})-?(\d{3})-?(\d{4})-?(\d*)$

单词中的正则表达式:

  • ^:字符串的开头
  • (\d{3}):一组3位数字
  • -?:无或单一破折号
  • (\d*):一组零个或多个数字
  • $:字符串
  • 的结尾

此外,我可以推荐Case study: Parsing Phone Numbers中的Dive Into Python book章节进行进一步阅读。

更新:这是Josh Smeaton在评论中提出的一个很好的观点。根据您的使用情况,可能更容易首先清理字符串(即删除破折号),然后验证是检查字符串中的所有字符是否为数字以及长度是否正确。如果您将这些电话号码存储在某个地方,最好将它们放在一个共同的格式中,而不是一次使用和不使用破折号。

答案 1 :(得分:0)

你的第二个\ D后跟+ - 这将匹配一个或多个非数字。用*替换它将匹配您的第二个字符串,因此您的正则表达式将如下所示:

'^(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$'

然而,正如erip和Dawid Ferenczy所说,使用'可能是一个好主意?'相反,它将匹配一个字符:

'^(\d{3})\D?(\d{3})\D?(\d{4})\D?(\d*)$'