使用python将文本中的n行匹配到正则表达式任何顺序

时间:2018-05-11 11:06:40

标签: python regex python-3.x python-2.7 scripting

我必须从输入文件中匹配文件墙的配置。在输入文件中,我将指定一个正则表达式。此正则表达式应与防火墙命令的输出匹配。

假设防火墙输出如下

ssh 192.217.254.20 255.255.255.255 junk_string
ssh 192.217.248.0 255.255.252.0 junk_string
ssh 192.217.254.21 255.255.255.255 junk_string
ssh 192.217.254.25 255.255.255.255 junk_string
ssh 192.217.254.38 255.255.255.255 junk_string
ssh 192.217.254.42 255.255.255.255 junk_string
ssh 192.115.24.64 255.255.255.224 junk_string
ssh 192.217.240.0 255.255.252.0 junk_string
ssh 192.217.236.0 255.255.252.0 junk_string
ssh 192.217.255.78 255.255.255.255 junk_string

我希望匹配9行,如下面的正则表达式。

(sh 192.217.((254.(20|21|25|38|42)|255.78) 255.255.255.255|(240|248|236).0 255.255.252.0) [^ ]*\r\n?){9}

但是当我将此正则表达式用于re.match或re.search时,规则将不会匹配,因为第7行。

有没有办法以任何顺序检查此正则表达式。我的意思是它应匹配9行,即使其中有一些不需要的行。

更新, 这就是我使用它的方式

 if re.match(result_expected[command],actual_result,re.M|re.I):
      if verbose == "True":
        print("Command output and expected output Matched")

 result_expected - is our regex I have given above.
 actual_result - is the 10 lines which is output of the command executed on the firewall. 

确定。为了更清楚,我的模式适用于以下14行。

pattern='(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) [^ ]*\r?\n?){14}'

ssh 192.168.240.0 255.255.252.0 junk_string
ssh 192.168.248.0 255.255.252.0 junk_string
ssh 192.168.236.0 255.255.252.0 junk_string
ssh 192.168.254.42 255.255.255.255 junk_string
ssh 192.168.254.25 255.255.255.255 junk_string
ssh 192.168.254.21 255.255.255.255 junk_string
ssh 192.168.255.78 255.255.255.255 junk_string
ssh 192.168.254.20 255.255.255.255 junk_string
ssh 192.168.254.38 255.255.255.255 junk_string
ssh 192.115.24.64 255.255.255.224 junk_string
ssh 192.168.254.2 255.255.255.255 junk_string
ssh 192.168.254.6 255.255.255.255 junk_string
ssh 192.168.255.91 255.255.255.255 junk_string
ssh 192.168.255.92 255.255.255.255 junk_string

但是当我们添加另一行

ssh 172.31.1.30 255.255.255.255 junk_string

然后正则表达式失败

ssh 192.168.240.0 255.255.252.0 junk_string
ssh 192.168.248.0 255.255.252.0 junk_string
ssh 192.168.236.0 255.255.252.0 junk_string
ssh 192.168.254.42 255.255.255.255 junk_string
ssh 192.168.254.25 255.255.255.255 junk_string
ssh 192.168.254.21 255.255.255.255 junk_string
ssh 192.168.255.78 255.255.255.255 junk_string
ssh 192.168.254.20 255.255.255.255 junk_string
ssh 192.168.254.38 255.255.255.255 junk_string
ssh 172.31.1.30 255.255.255.255 junk_string
ssh 192.115.24.64 255.255.255.224 junk_string
ssh 192.168.254.2 255.255.255.255 junk_string
ssh 192.168.254.6 255.255.255.255 junk_string
ssh 192.168.255.91 255.255.255.255 junk_string
ssh 192.168.255.92 255.255.255.255 junk_string

我的要求是正则表达式只要有14行就可以正常工作。即使额外的行在之前/之后/之间出现。

我们如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

如果你想在字面上匹配一个点,你应该将其转义为\.,否则它将意味着匹配任何字符。还有一个领先的s缺失,现在它说sh

如果您使用替换并且不想捕获值,则可以使用非捕获组(?:

要匹配ssh 192.115.24.64 255.255.255.224 junk_string以外的所有行,您可以使用findall

如果没有捕获群组,您可以将以下行匹配:

ssh 192\.217\.(?:254\.(?:2[015]|38|42)|255\.78|24[08]\.0|236\.0) 255\.255\.(?:255\.255|252\.0) [^ ]*\r?\n|\r

Demo Python