You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中联系人正则匹配问题:误识别非联系人数字串

解决巴基斯坦电话号码正则匹配问题

看起来你需要精准匹配指定格式的巴基斯坦电话号码,同时排除那些非电话号码的长数字串或短数字代码。先梳理你给出的目标号码的规律,再构建合适的正则表达式:

目标号码的核心规律

你的目标号码分为两类,核心特征是数字长度和前缀格式:

  • 国际格式:以+92(+92)开头,总数字长度为12或13位,允许用空格/连字符分隔各段
  • 国内格式:以0开头,总数字长度为11位,允许中间用空格分隔

精准匹配的正则表达式

下面的正则会覆盖所有目标格式,同时自动排除不符合长度/前缀的数字串:

^(?:(?:\+92|\(\+92\))[- ]?(?:\d{2}[- ]?\d{9}|\d{3}[- ]?\d{7}|\d{10})|0\d{2}[- ]?\d{7}|0\d{10})$

正则各部分解释

  • (?:\+92|\(\+92\)):匹配国际前缀,支持+92(+92)两种写法
  • [- ]?:匹配可选的空格或连字符分隔符(支持号码各段间的分隔)
  • \d{2}[- ]?\d{9}:匹配国际格式的固定电话(2位区号+9位号码,比如+92 42 111-865-865
  • \d{3}[- ]?\d{7}:匹配国际格式的移动电话(3位号段+7位号码,比如+92 332 5138889
  • \d{10}:匹配国际格式中无分隔的完整号码(比如+92 3325138889
  • 0\d{2}[- ]?\d{7}:匹配国内固定电话(比如042 111865865
  • 0\d{10}:匹配国内移动电话(比如03325138889

修正后的Python代码示例

import re

strdata = """Some Data here 
+92 42 111-865-865
(+92) 42 3256 0445
03325138889
0332 5138889
+92 332 5138889
+92 3325138889
48358982872144
100220100
36470002"""

# 添加re.MULTILINE让^/$匹配每行的开头/结尾
contactRegex = re.compile(r'^(?:(?:\+92|\(\+92\))[- ]?(?:\d{2}[- ]?\d{9}|\d{3}[- ]?\d{7}|\d{10})|0\d{2}[- ]?\d{7}|0\d{10})$', re.MULTILINE)
contactlist = contactRegex.findall(strdata)

print(contactlist)

运行后会输出所有目标电话号码,不会匹配48358982872144100220100这类不符合规则的数字串。

为什么你之前的正则会误匹配?

你之前的正则^[+][(][0-9][0-9][)]|[+][0-9][0-9]|[0,4]|[-/0-9]*$存在几个关键问题:

  • 没有正确分组,|的优先级导致匹配逻辑混乱
  • [-/0-9]*会匹配任意数量的数字/连字符/斜杠,完全无法限制号码长度
  • [0,4]仅匹配单个04,不符合电话号码的完整格式

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

火山引擎 最新活动