要在匹配字符串后也打印下一行吗

2024-05-16 06:36:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一根绳子

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 

Tags: ofreoutputisnotviagatewaylast
2条回答

试试这个:

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

我添加了(?s)来添加s标志来匹配空白。你知道吗

您可以选择匹配在图案后以空格开头的可选行:

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

this regex demo

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

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

此外,我建议转义.以匹配IP地址内的文字点,并将\w替换为\d以仅匹配数字。你知道吗

如果第一个O出现在一行的开头,为了安全起见,在它前面加上^。你知道吗

相关问题 更多 >