Python中的电话号码正则表达式(Regex)

4

《Python深入浅出》给出了一个非常棒的小教程,用于创建电话号码的正则表达式: http://diveintopython3.ep.io/regular-expressions.html#phonenumbers

最终版本如下所示:

phone_re = re.compile(r'(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$', re.VERBOSE)

对于我能想到的几乎所有示例,这种方法都很好用,但是我发现了一个相当大的失败,似乎无法修复。

如果电话号码之前有一组3位数字,则可以正常工作。例如: “500美元折扣,请拨打123-456-7891”

如果电话号码之后有一组3位数字,则会失败。例如: “拨打123-456-7891以获得高达500的折扣”

有什么解决方法可以适用于两种情况吗?


6
我总是惊讶于网络社区中备受尊敬的人士如何全心全意地提供错误(即以美国为中心的)建议。这可能是为初学者提供正则表达式实际感受的好的学术例子,但在实际应用中不应使用它。电话号码在世界各地的使用方式并不相同。 - Tomalak
4
即使在那儿也不一定准确,因为并非每个人都会按照正确格式书写电话号码。 - Joey
2
@Amber:“永远不打算在美国以外的地方使用您的应用程序。”这就是为什么许多应用程序仍然无法处理美国ASCII范围之外的字符的原因。这是一个过时的思维模式,我们应该摆脱它。 - Tomalak
3
《深入 Python》一书的作者明确表示他正在解析美国电话号码,并列出了电话号码可能出现的格式,为《深入 Python》辩护。 - unutbu
2
这种现象也是为什么目光短浅的程序员坚持认为人名中不会有标点符号,即使撇号、句点、连字符和空格都很常见。(我甚至不想开始讨论那些不适合ASCII编码的名字。) - bstpierre
显示剩余3条评论
2个回答

2

(\d*)$ 表示你匹配的字符串必须以数字结尾($ 表示“行尾”)。如果你要匹配的电话号码不在行尾,尝试删除 $


0

这是您的原始文本,带有一些空格(使用re.VERBOSE或删除空格):

(\d{3}) \D* (\d{3}) \D* (\d{4}) \D* (\d*)

\D*将匹配任何不是数字的字符,包括单词。也许你应该尝试这个:

(\d{3}) \W* (\d{3}) \W* (\d{4}) \W* (\d*)

\W* 匹配任何非单词字符。它将匹配 (222) - 222 - 2222。但是,如果数字之间有字母,例如 (222) x 222 - 2222,则不会匹配。匹配的最后一部分 (\d*) 看起来是在寻找扩展名。这些可以以多种方式格式化 - 我建议您要么放弃它,要么根据您期望的数据外观进行改进。而且,就像Amber所说,您应该放弃$


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接