Python多行字符串条件正则匹配:校验board add 0/1规则
Python多行文本正则校验板卡配置方案
问题关联
本问题关联Stack Overflow历史提问《Unable to use conditional regex to test my string in python》,原有方案仅支持逐行字符串处理,无法覆盖多行字符串的匹配校验需求。
校验规则
- 仅针对
board add 0/1条目单独编写规则,不使用board add 0/\d+通配写法,后续将逐个扩展规则覆盖board add 0/2至board add 0/21的校验 - 合法判定逻辑:
- 若字符串中存在
board add 0/1条目,其后必须跟随合法型号aaa或bbb,否则判定为非法 - 若字符串中不存在
board add 0/1条目,直接判定为合法
- 若字符串中存在
- 校验结果通过
bool(re.match(...))返回,需全部覆盖三类测试场景:- 普通匹配场景:多行文本包含
board add 0/1 aaa及其他正常板卡配置条目,返回True - 错误型号场景:多行文本中
board add 0/1后接非法型号名xxx,返回False - 缺失0/1板卡场景:多行文本无
board add 0/1配置条目,其余板卡配置正常,返回True
- 普通匹配场景:多行文本包含
此前方案问题
此前编写的多版正则(例如(board add 0/1)? (?(1) (aaa|bbb))、^(?:(?!board add 0/1).)*$|board add 0/1 (?:aaa|bbb)等)均无法同时通过全部测试用例,分别在错误型号场景、缺失板卡场景返回错误校验结果。
可行实现
正则代码
使用re.DOTALL与re.MULTILINE模式配合负向预查逻辑即可覆盖全部场景,代码如下:
import re check_pattern = r'^(?!.*board add 0/1 (?!(?:aaa|bbb)\b)).*$' # 调用示例 # result = bool(re.match(check_pattern, target_text, re.DOTALL | re.MULTILINE))
逻辑说明
re.DOTALL模式让.可以匹配换行符,实现跨行全局扫描;re.MULTILINE模式让^和$匹配整个文本的首尾位置,保证全量校验- 核心负向预查逻辑
(?!.*board add 0/1 (?!(?:aaa|bbb)\b))会全局扫描文本:只要存在board add 0/1后接非aaa/bbb的非法内容,整个匹配直接失败;如果文本中完全不存在board add 0/1条目,预查条件直接成立,匹配成功
扩展方式
后续新增其他槽位的校验规则时,只需将正则中的0/1替换为对应槽位编号,将(?:aaa|bbb)替换为对应槽位支持的合法型号列表即可,无需改动整体正则结构。
内容的提问来源于stack exchange,提问作者Mond Wan
相关产品推荐
相关产品推荐

