如何用Python实现正则任意顺序匹配指定行数的防火墙配置?
解决方案:忽略无关行匹配指定的防火墙配置行
我明白你的问题了——你原来的正则表达式依赖连续匹配指定数量的目标行,一旦中间插入无关行就会失效。你需要的是不管行的顺序、不管有没有无关行,只要所有指定的目标行(或指定数量的符合模式的行)存在,就判定匹配成功。下面给你两种针对性的解决方案:
方案1:检查具体的14行全部存在(纯正则实现)
如果你的需求是确保你列出的那14行每一行都必须出现(不管顺序和无关行),可以使用**正向预查(Positive Lookahead)**来实现。这种方式会逐个检查每个目标行是否在文本中存在,同时允许其他任意内容。
正则示例
import re # 构建正则:每个正向预查对应一个必须存在的目标行 pattern = r'(?s)^' \ # 网段行 r'(?=.*ssh 192\.168\.240\.0 255\.255\.252\.0 [^ ]*)' \ r'(?=.*ssh 192\.168\.248\.0 255\.255\.252\.0 [^ ]*)' \ r'(?=.*ssh 192\.168\.236\.0 255\.255\.252\.0 [^ ]*)' \ # 254段单个IP行 r'(?=.*ssh 192\.168\.254\.42 255\.255\.255\.255 [^ ]*)' \ r'(?=.*ssh 192\.168\.254\.25 255\.255\.255\.255 [^ ]*)' \ r'(?=.*ssh 192\.168\.254\.21 255\.255\.255\.255 [^ ]*)' \ r'(?=.*ssh 192\.168\.254\.20 255\.255\.255\.255 [^ ]*)' \ r'(?=.*ssh 192\.168\.254\.38 255\.255\.255\.255 [^ ]*)' \ r'(?=.*ssh 192\.168\.254\.2 255\.255\.255\.255 [^ ]*)' \ r'(?=.*ssh 192\.168\.254\.6 255\.255\.255\.255 [^ ]*)' \ # 255段单个IP行 r'(?=.*ssh 192\.168\.255\.78 255\.255\.255\.255 [^ ]*)' \ r'(?=.*ssh 192\.168\.255\.91 255\.255\.255\.255 [^ ]*)' \ r'(?=.*ssh 192\.168\.255\.92 255\.255\.255\.255 [^ ]*)' \ # 115段IP行 r'(?=.*ssh 192\.115\.24\.64 255\.255\.255\.224 [^ ]*)' \ r'.*$' # 你的原有调用逻辑 if re.match(pattern, actual_result, re.I): if verbose == "True": print("Command output and expected output Matched")
正则解释
(?s):开启DOTALL模式,让.可以匹配换行符,确保预查能覆盖整个文本。^和$:锚定整个文本的开头和结尾,确保我们检查的是完整的命令输出。- 每个
(?=.*...):正向预查,不消耗字符,仅检查对应的目标行是否在文本中存在,所有预查都会基于整个文本进行验证。 - 最后的
.*$:匹配整个文本内容,确保re.match能返回成功(预查仅做存在性检查,需要实际匹配内容)。
方案2:统计符合模式的行数(更易维护)
如果你的需求是确保至少有14行符合你定义的模式(不需要指定具体的IP,只要符合规则即可),推荐使用拆分文本逐行检查的方式,这种方式代码更清晰、易维护,也更灵活。
代码示例
import re def validate_ssh_output(actual_result, verbose=False): # 定义你原来的匹配模式(无需连续匹配的限制) line_pattern = re.compile( r'ssh 192.(168.((254.(2|6|20|21|25|38|42)|255.78|255.91|255.92) 255.255.255.255|(240|248|236).0 255.255.252.0)|115.24.64 255.255.255.224) [^ ]*', re.I ) # 拆分输出为单行,统计符合模式的行数 lines = actual_result.splitlines() matched_count = sum(1 for line in lines if line_pattern.match(line)) # 判断是否达到要求的数量 if matched_count >= 14: if verbose: print("Command output and expected output Matched") return True return False # 调用示例 validate_ssh_output(actual_result, verbose=(verbose == "True"))
优势
- 逻辑直观:逐行检查,避免复杂的跨行正则。
- 易维护:修改匹配模式或需要的行数时,只需调整正则或数字即可。
- 灵活扩展:可以轻松添加去重、日志输出等额外逻辑。
方案选择建议
- 如果必须用单个正则表达式完成匹配(比如某些工具仅支持正则),选择方案1。
- 如果是在Python代码中实现,优先选择方案2,代码可读性和可维护性更强。
内容的提问来源于stack exchange,提问作者Randeep
相关产品推荐
相关产品推荐

