Python 3正则表达式:如何在长度范围中排除特定长度?
解决13-20位数字排除15、17位的正则方案
你的需求完全可行,Python的re模块支持多种语法实现这个逻辑,下面提供两种适合新手的方案:
方案一:枚举允许的长度(直观易读)
直接把符合要求的长度范围列出来,用非捕获分组合并规则:
^(?:[0-9]{13,14}|[0-9]{16}|[0-9]{18,20})$
- 拆解说明:
[0-9]{13,14}:匹配13或14位数字[0-9]{16}:匹配16位数字[0-9]{18,20}:匹配18到20位数字(?:...)是非捕获分组,用来组合规则,避免生成多余的捕获组,不影响匹配结果但更高效。
方案二:负向预查排除特定长度(灵活扩展)
如果后续需要排除更多长度,用负向预查(零宽断言)更方便:
^(?!.{15}$)(?!.{17}$)[0-9]{13,20}$
- 拆解说明:
^[0-9]{13,20}$:基础规则,匹配13到20位的数字字符串(?!.{15}$):负向预查,断言整个字符串长度不等于15(从开头到结尾不是刚好15个字符)(?!.{17}$):同理,断言字符串长度不等于17- 两个断言会在匹配基础规则前先检查长度,不符合的直接排除,不影响其他合法长度。
Python验证示例
import re # 任选一种方案的正则即可 pattern = r'^(?:[0-9]{13,14}|[0-9]{16}|[0-9]{18,20})$' test_cases = [ '1234567890123', # 13位 → 匹配 '12345678901234', # 14位 → 匹配 '123456789012345', # 15位 → 不匹配 '1234567890123456', # 16位 → 匹配 '12345678901234567',# 17位 → 不匹配 '123456789012345678',#18位 → 匹配 '1234567890123456789',#19位 → 匹配 '12345678901234567890',#20位 → 匹配 ] for case in test_cases: result = re.match(pattern, case) print(f"{case}: {'匹配' if result else '不匹配'}")
内容的提问来源于stack exchange,提问作者csharp1321
相关产品推荐
相关产品推荐

