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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:27:22