我有一个弦
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
出现在行的开头,请在其前面添加^
以确保安全。