潜入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的折扣”
有关修复的任何想法都适用于这两个示例吗?
答案 0 :(得分:1)
(\d*)$
要求您匹配的字符串以数字字符结尾($
表示“行尾”)。如果您要匹配较大的字符串,请尝试删除$
,其中电话号码可能不在该行的末尾。
答案 1 :(得分: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说的那样,你应该放弃$
。