You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python正则表达式findall匹配NANP标准10位电话号码

匹配NANP标准10位电话号码的正则修正方案

你当前的正则表达式存在两个关键问题:

  1. \d{3}* 的写法错误——{3}已经是精确匹配3个数字,后面加*会变成“匹配3个数字0次或多次”,完全偏离需求;
  2. \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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:05:44