使用Python正则表达式findall匹配NANP标准10位电话号码
匹配NANP标准10位电话号码的正则修正方案
你当前的正则表达式存在两个关键问题:
\d{3}*的写法错误——{3}已经是精确匹配3个数字,后面加*会变成“匹配3个数字0次或多次”,完全偏离需求;\D*会匹配任意数量的非数字字符,可能误抓多余内容(比如多个符号、空格等)。
针对你的需求(匹配用短横线-或点号.分隔的NANP标准10位电话),可以用以下修正方案:
基础版正则(仅匹配带指定分隔符的号码)
使用严格限定分隔符的正则,确保只匹配XXX-XXX-XXXX或XXX.XXX.XXXX格式:
import re numbers = "123-456-7890, 123.456.7890, 1234567890, 12-345-6789" phones = re.findall(r"\b\d{3}[-.]\d{3}[-.]\d{4}\b", numbers) print(phones) # 输出: ['123-456-7890', '123.456.7890']
\b:单词边界,避免匹配嵌入在其他数字串中的类似格式(比如1123-456-7890的前10位);[-.]:精确匹配短横线或点号其中一个,排除其他非数字分隔符;\d{3}/\d{4}:严格匹配对应位数的数字,符合NANP的10位结构。
进阶版正则(支持带分隔符或纯数字的号码)
如果需要同时兼容纯数字的10位号码(XXXXXXXXXX),且要求分隔符前后一致(要么都用-,要么都用.,要么都没有),可以用反向引用实现:
import re numbers = "123-456-7890, 123.456.7890, 1234567890, 123-456.7890" # 捕获完整匹配项 phones = re.findall(r"\b(\d{3}([-.]?)\d{3}\2\d{4})\b", numbers) # 提取结果中的完整号码 phones = [match[0] for match in phones] print(phones) # 输出: ['123-456-7890', '123.456.7890', '1234567890']
([-.]?):捕获可选的分隔符(0次或1次);\2:反向引用前面捕获的分隔符,确保前后分隔符一致(避免出现123-456.7890这种混合分隔符的错误格式)。
内容的提问来源于stack exchange,提问作者JD13
相关产品推荐
相关产品推荐

