如何在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
相关产品推荐
相关产品推荐

