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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:57:14