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

如何用Python Regex实现美国电话号码合法校验与分段提取

美国电话号码正则匹配优化方案

原正则缺陷梳理

  • 区号左括号使用可选匹配规则,同时允许区号后接横杠,导致无括号带横杠的非法号码(如916-111-1111)可通过校验
  • 未限制区号括号内只能为纯3位数字、不能存在空格,会匹配到( 916)、(a56)这类非法格式
  • 未限制中间3位数字和后续横杠之间不能有空格,会匹配到(916)111 -1111这类非法格式
  • 未限制末尾4位必须为纯数字,会匹配到带非数字字符的非法号码

优化后正则

^\s*\((\d{3})\)\s*(\d{3})-(\d{4})\s*$

规则说明:

  • 首尾的\s*允许号码前后存在任意空格
  • \((\d{3})\)强制区号必须被英文括号包裹,且括号内仅能为3位纯数字,完全拦截括号带空格、带非数字字符、无括号的非法场景
  • 区号后的\s*允许区号和中间3位数字之间存在任意空格
  • (\d{3})-强制中间3位数字后直接接横杠,中间不可存在空格,拦截横杠前带空格的非法场景
  • (\d{4})强制末尾4位为纯数字,拦截含非数字字符的非法格式
  • 3个捕获组依次对应不带括号的区号、中间3位数字、末尾4位数字,无需额外处理符号即可直接提取

使用示例(Python)

import re

phone_pattern = re.compile(r'^\s*\((\d{3})\)\s*(\d{3})-(\d{4})\s*$')
test_num = '   (916)      111-1111    '
match_res = phone_pattern.match(test_num)
if match_res:
    area_code, mid_part, last_part = match_res.groups()
    # 提取结果:area_code = '916', mid_part = '111', last_part = '1111'
else:
    print("号码格式非法")

匹配效果验证

合法样例全部通过校验

  • (916) 111-1111
  • (916)111-1111
  • (916) 111-1111

非法样例全部拦截

  • 916-111-1111:无区号括号
  • (916)111 -1111:横杠前存在空格
  • ( 916)111-1111:括号内存在空格
  • (abc) 111-11i1:含非数字字符

内容的提问来源于stack exchange,提问作者Toly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:18:02