正则表达式匹配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
相关产品推荐
相关产品推荐

