如何用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
相关产品推荐
相关产品推荐

