2010-08-14 305 views
2

深入Python给出了一个惊人的小教程创建为电话号码的正则表达式:http://diveintopython3.ep.io/regular-expressions.html#phonenumbers电话号码正则表达式(正则表达式)在Python

最终版本出来的样子:

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

这几乎适用于我可以想到的所有示例,但是我发现了一个很大的故障,我似乎无法修复。

如果一组3位数字出现在电话号码前面,它可以正常工作。 IE: “500美元关闭,请致电123-456-7891”

如果一组3位数字出现在电话号码后面,则失败。 IE: “致电123-456-7891可享受高达500的折扣”

有关适用于两个示例的修复的任何建议?

+6

我总是很惊讶网络社区中的尊重人士如何给出有缺陷的(即以美国为中心)建议。这可能是一个很好的学术示例,可以为正则表达式提供初学者的实用感受,但是您不应该在实际应用中使用它。世界各地的电话号码都不一样。 – Tomalak 2010-08-14 19:13:54

+0

更具体地说,如果您从未计划在除美国以外的任何地方使用您的应用程序,则应仅在应用程序中使用它。 – Amber 2010-08-14 19:14:31

+4

甚至没有,因为不是每个人都可能像他们应该格式化一个电话号码。 – Joey 2010-08-14 19:16:11

回答

1

(\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*)似乎在寻找延伸。这些可以通过多种方式进行格式化—我建议您根据您希望数据的外观来删除它或对其进行优化。而且,就像安伯说的那样,你应该放弃$