Python中的电话号码正则表达式

4 投票
2 回答
14138 浏览
提问于 2025-04-16 02:48

《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*)$ 的意思是你要匹配的字符串必须以数字结尾(这里的 $ 表示“行的结束”)。如果你要匹配的字符串比较长,而电话号码可能不在行的最后,可以试着去掉 $

撰写回答