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

正则表达式匹配5ABCDXXYY格式号码的技术求助

解决正则匹配特定号码格式的问题

你需要匹配严格符合5ABCDXXYY格式的9位号码,之前的正则既没有锚定整个字符串,也没有限制ABCD四个数字互不相同,才会出现误匹配更长格式的情况。

正确的正则表达式

^5(?:(\d)(?!\1)(\d)(?!\1|\2)(\d)(?!\1|\2|\3)(\d))(\d)\5(\d)\6$

正则各部分解析

  • ^5:强制号码以数字5开头,^锚定字符串起始位置,避免从中间部分匹配
  • (?:(\d)(?!\1)(\d)(?!\1|\2)(\d)(?!\1|\2|\3)(\d)):用非捕获组包裹ABCD四个互不重复的数字:
    • (\d):捕获第一个数字A(捕获组1)
    • (?!\1):负向预查,确保下一个数字不等于A
    • (\d):捕获第二个数字B(捕获组2)
    • (?!\1|\2):确保下一个数字不等于A或B
    • (\d):捕获第三个数字C(捕获组3)
    • (?!\1|\2|\3):确保下一个数字不等于A、B、C
    • (\d):捕获第四个数字D(捕获组4)
  • (\d)\5:匹配XX部分,(\d)捕获X(捕获组5),\5重复X,形成两个相同数字
  • (\d)\6:匹配YY部分,(\d)捕获Y(捕获组6),\6重复Y,形成两个相同数字
  • $:锚定字符串结束位置,确保整个字符串刚好9位,杜绝匹配更长的格式

修改后的代码示例

import re

# 测试匹配示例
S_E_4_A = 590631122
S_E_4_A_str = str(S_E_4_A)
pattern = r'^5(?:(\d)(?!\1)(\d)(?!\1|\2)(\d)(?!\1|\2|\3)(\d))(\d)\5(\d)\6$'
result = re.sub(pattern, "Special-Private", S_E_4_A_str)
print(result)  # 输出: Special-Private

# 测试不匹配示例
test_case1 = "566781100"
result1 = re.sub(pattern, "Special-Private", test_case1)
print(result1)  # 输出: 566781100(无替换,不匹配)

test_case2 = "519283412"
result2 = re.sub(pattern, "Special-Private", test_case2)
print(result2)  # 输出: 519283412(无替换,不匹配)

如果只是需要判断号码是否符合格式,用re.fullmatch(pattern, number_str)会更直接——返回匹配对象则符合格式,否则不符合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:05:22