Python中的电话号码正则表达式
《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位数字,它就能正常工作。比如说:“500元优惠,拨打123-456-7891”
但是如果3位数字在电话号码后面,它就不行了。比如说:“拨打123-456-7891,享受高达500元的折扣”
有没有什么办法可以让它在这两种情况下都能正常工作呢?
2 个回答
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说的,你可能应该去掉 $
。
2
这个 (\d*)$
的意思是你要匹配的字符串必须以数字结尾(这里的 $
表示“行的结束”)。如果你要匹配的字符串比较长,而电话号码可能不在行的最后,可以试着去掉 $
。