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

如何在Python中按顺序用模式列表校验输入字符串?

解决按顺序校验特定格式字符串的正则方案

正则表达式编写

直接用re.compile编写完整匹配规则,确保字符串从开头到结尾完全符合要求:

import re

pattern = re.compile(
    r'^((att|ptt)[0-6])_(epic|semi)_(app[0-6](?:_clm[0-9]_(sub|sup))?)_(valid|Invalid)$'
)

规则对应解释

  • 开头部分:(att|ptt)[0-6] 匹配att/ptt后跟0-6的单个数字,对应规则1
  • 第二部分:(epic|semi) 严格匹配这两个固定字符串,对应规则2
  • 第三部分:app[0-6](?:_clm[0-9]_(sub|sup))? 实现两种分支:
    • 基础分支:app[0-6] 匹配app后跟0-6的单个数字
    • 扩展分支:app[0-6]_clm[0-9]_(sub|sup) 匹配app+数字后接clm+数字,再跟sub/sup;?:表示非捕获组,避免不必要的分组捕获
  • 结尾部分:(valid|Invalid) 匹配指定的结尾字符串,注意大小写区分
  • ^和$确保整个字符串完全匹配,避免部分符合的情况被误判通过

校验函数与错误处理

编写校验函数,不匹配时抛出明确的错误提示:

def validate_string(input_str):
    match = pattern.fullmatch(input_str)
    if not match:
        raise ValueError(
            "输入格式不符合要求!正确格式示例:att2_epic_app_clm1_sub_valid\n"
            "规则说明:\n"
            "1. 开头必须是att/ptt后跟0-6的数字\n"
            "2. 第二部分必须是epic或semi\n"
            "3. 第三部分为app+0-6数字,或app+0-6数字_clm+0-9数字_sub/sup\n"
            "4. 结尾必须是valid或Invalid"
        )
    # 如需获取各部分匹配结果,可通过match.groups()获取
    return True

# 测试示例
try:
    validate_string("att2_epic_app_clm1_sub_valid")
    print("格式校验通过")
    validate_string("ptt6_semi_app3_valid")
    print("格式校验通过")
    validate_string("att7_epic_app_clm1_sub_valid")  # 开头数字超出范围,会报错
except ValueError as e:
    print(e)

关键注意点

  • 使用fullmatch()而非match(),确保字符串从头到尾完全匹配,避免前缀符合但后续不符合的情况被误判通过
  • 正则中的非捕获组(?:...)减少不必要的分组,让正则更高效
  • 错误提示中明确给出示例和规则,方便用户快速定位问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:10:28