4

Dive into 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 位数字出现在电话号码之前,它可以正常工作。IE:“减 500 美元,请致电 123-456-7891”

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

关于适用于这两个示例的修复的任何想法?

4

2 回答 2

2

(\d*)$要求您匹配的字符串以数字字符结尾($表示“行尾”)。$如果您要与电话号码可能不在行尾的较大字符串匹配,请尝试删除。

于 2010-08-14T19:06:48.583 回答
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 所说,您可能应该放弃$.

于 2010-08-14T19:15:49.577 回答