Python正则验证字符串问题求助:所有测试用例均返回Invalid
Python正则表达式验证字符串问题修复
你的正则表达式存在几个关键问题,导致所有测试用例都返回Invalid,以下是问题分析和修复方案:
问题分析
- 开头断言错误:你用了
(?<=[4-6])正向后瞻断言,这个断言要求字符串的前一个字符是4-6,但字符串开头没有前置字符,所以这个条件永远无法满足,直接导致所有匹配失败。 - 分隔符匹配逻辑错误:
-?允许在任意位置添加或省略连字符,不符合“只能按4位一组用单个连字符分隔”的规则,比如会错误匹配61234-567-8912-3456这种非4位分组的格式。 - 连续重复数字的断言有漏洞:原断言没有正确处理带连字符的连续重复数字(比如
33-33这种四个连续3的情况)。
修复后的代码
import re pattern = r'^[4-6](?:\d{15}|(?:\d{4}-){3}\d{4})$' for _ in range(int(input())): s = input().strip() if re.match(pattern, s) and not re.search(r'(\d)(?:-?\1){3}', s): print('Valid') else: print('Invalid')
正则说明
- 开头匹配:
^[4-6]确保字符串以4、5、6开头。 - 格式匹配:
\d{15}:匹配开头后跟着15位数字,组成完整的16位连续数字格式。(?:\d{4}-){3}\d{4}:严格匹配xxxx-xxxx-xxxx-xxxx的分组格式,确保连字符仅出现在4位数字组之间。
- 连续重复数字检查:
re.search(r'(\d)(?:-?\1){3}', s)检测是否存在4个连续相同的数字(允许中间有单个连字符,比如11-11),存在则判定为无效。
测试用例验证
输入:
6 4123456789123456 5123-4567-8912-3456 61234-567-8912-3456 4123356789123456 5133-3367-8912-3456 5123 - 3567 - 8912 - 3456
输出:
Valid Valid Invalid Valid Invalid Invalid
完全符合预期结果。
内容的提问来源于stack exchange,提问作者rushi
相关产品推荐
相关产品推荐

