使用Python正则处理美国电话号码,解决无分隔符10位号码拆分问题
问题原因
原正则的条件分支仅覆盖了「带左括号→匹配右括号+后三位」和「无左括号→匹配横杠+后三位」两种场景,没有兼容无任何分隔符的10位连续数字场景,同时原正则中(\d+)未限制长度,会导致连续数字场景下贪婪匹配吃掉过多位数,拆分结果异常。
修改方案
1. 正则调整
将原正则替换为如下版本,新增无分隔符兼容逻辑,同时固定区号长度为3位:
r'\s*(?:\+1\s*)?(\()?(\d{3})(?(1)\)\s*|[-.\s]?)(\d{3})[-.\s]?(\d{4})\s*$'
调整点说明:
- 固定区号匹配长度为
\d{3},避免贪婪匹配异常 - 把原条件分支后的分隔符匹配改为可选的
[-.\s]?,同时兼容横杠、点号、空格、无分隔符4种场景 - 新增可选的国家码
+1匹配,可解决原测试用例中+1 (404) 555-3355报错的问题,不需要识别国家码的话可以直接删掉正则开头的(?:\+1\s*)? - 保留原括号匹配逻辑:如果有左括号必须匹配对应的右括号,括号不闭合的异常格式仍会正常报错
2. 代码调整
修改分组提取逻辑适配新的正则分组:
import re def par_ph(p): t1 = t2 = t3 = "" pattern = r'\s*(?:\+1\s*)?(\()?(\d{3})(?(1)\)\s*|[-.\s]?)(\d{3})[-.\s]?(\d{4})\s*$' pp = re.match(pattern, p) if pp: # 直接取第2、3、4个分组,对应区号、中间三位、末尾四位 t1, t2, t3 = pp.groups()[1:] print(t1, t2, t3) else: print("ValueError " + p) return t1, t2, t3
适配效果
修改后可正常匹配原报错的合法场景:
- 无分隔符10位号码:
9162223333拆分结果为9162223333 - 点号分隔:
404.555.3355拆分结果为4045553355 - 空格分隔:
916 555-1111拆分结果为9165551111 - 带国家码:
+1 (404) 555-3355拆分结果为4045553355
原已正常匹配的带括号、横杠格式完全兼容,括号不闭合等异常格式仍会正常抛出错误。
内容的提问来源于stack exchange,提问作者Toly
相关产品推荐
相关产品推荐

