我有一个弦

output = '''Gateway of last resort is not set

      10.0.1.0/8 is variably subnetted, 4 subnets, 2 masks
C        10.1.0.0/24 is directly connected, Ethernet1/0
L        10.1.0.1/32 is directly connected, Ethernet0/0
C        10.2.0.0/24 is directly connected, Ethernet0/1
L        19.18.2.1/32 is directly connected, Serial2/1
O     19.18.3.0/20 [110/128] via 19.18.2.2, 00:00:50, Serial1/1
                     [110/128] via 19.18.1.2, 00:00:50, Serial1/0

O     12.18.3.1/20 [110/128] via 19.18.2.2, 00:00:50, Serial1/1
                     [110/128] via 19.18.1.2, 00:00:50, Serial1/0

O     12.18.1.0/20 [110/128] via 19.18.2.2, 00:00:50, Serial0/1
                     [110/128] via 19.18.1.2, 00:00:50, Serial0/0'''


我从这个字符串中匹配O并使用以下命令打印整行:

regex = re.findall("O\s+(?P<O>\w+.\w+.\w+.\w+.*)", output, re.M)


它给我的输出为:

['19.18.3.0/20 [110/128] via 19.18.2.2, 00:00:50, Serial1/1', '12.18.3.1/20 [110/128] via 19.18.2.2, 00:00:50, Serial1/1', '12.18.1.0/20 [110/128] via 19.18.2.2, 00:00:50, Serial0/1']


但是我也想将这些行与上面的输出一起打印。

[110/128] via 19.18.1.2, 00:00:50, Serial1/0,  [110/128] via 19.18.1.2, 00:00:50, Serial1/0, [110/128] via 19.18.1.2, 00:00:50, Serial0/0

最佳答案

您可以选择匹配以模式后的空格开头的可选行:

O\s+(?P<O>\d+\.\d+\.\d+\.\d+.*(?:[\r\n]+[^\S\r\n]+.*)?)
                              ^^^^^^^^^^^^^^^^^^^^^^^^


this regex demo

更新了模式详细信息:(?:[\r\n]+[^\S\r\n]+.*)?是一个可选的非捕获组((?:...)?),它与1或0次匹配


[\r\n]+-一个或多个CR / LF符号(仅匹配一个,请使用(?:\r?\n|\r|\n)
[^\S\r\n]+-除非空白和CR / LF以外的1个或多个符号(因此,它仅与水平空白匹配
.*-该行的其余部分(在没有DOTALL模式的情况下,默认情况下,.与换行符不匹配)。


另外,我建议转义.以匹配IP地址内的文字点,并用\w替换\d以仅匹配数字。

如果第一个O出现在行的开头,请在其前面添加^以确保安全。

09-30 16:56
查看更多