电话号码正则表达式(正则表达式)在Python
问题描述:
深入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的折扣”
有关适用于两个示例的修复的任何建议?
答
(\d*)$
要求您匹配的字符串以数字字符结尾($
表示“行尾”)。尝试删除$
,如果您匹配的电话号码可能不在该行末尾的较大字符串。
答
这是你的原创,有一些空间(使用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*)
似乎在寻找延伸。这些可以通过多种方式进行格式化—我建议您根据您希望数据的外观来删除它或对其进行优化。而且,就像安伯说的那样,你应该放弃$
。
我总是很惊讶网络社区中的尊重人士如何给出有缺陷的(即以美国为中心)建议。这可能是一个很好的学术示例,可以为正则表达式提供初学者的实用感受,但是您不应该在实际应用中使用它。世界各地的电话号码都不一样。 – Tomalak 2010-08-14 19:13:54
更具体地说,如果您从未计划在除美国以外的任何地方使用您的应用程序,则应仅在应用程序中使用它。 – Amber 2010-08-14 19:14:31
甚至没有,因为不是每个人都可能像他们应该格式化一个电话号码。 – Joey 2010-08-14 19:16:11