在python中使用regex选择字符串后的字符串



想象一下,我们有一个字符串,比如:

Routing for Networks:
0.0.0.0/32
5.6.4.3/24
2.3.1.4/32
Routing Information Sources:
Gateway         Distance      Last Update
192.168.61.100        90      00:33:51
192.168.61.103        90      00:33:43
Irregular IPs:
1.2.3.4/24
5.4.3.3/24

我需要得到一个IP列表;网络路由:";以及";路由信息源:";如下所示:

['0.0.0.0/32","5.6.4.3/24","2.3.1.4/32"]

到目前为止,我所做的是:

Routing for Networks:n(.+(?:n.+)*)nRouting

但它并没有如预期的那样发挥作用。

更新:我的代码如下:

re.findall("Routing for Networks:n(.+(?:n.+)*)nRouting", string)

正如@the fourth bird所说,以下模式对我有效:

pattern = r"Routing for Networks:n((?:(?:d{1,3}.){3}d{1,3}/d+n)+)(?=Routing)"

捕获组1的值包括换行符。您可以在换行符上拆分捕获组1的值以获得分隔的值。

如果你想使用re.findall,你会得到一个第1组值的列表,你可以在新行上拆分列表中的每个值。

单组1匹配的示例:

import re
pattern = r"Routing for Networks:n(.+(?:n.+)*)nRouting"
s = ("Routing for Networks:n"
"0.0.0.0/32n"
"5.6.4.3/24n"
"2.3.1.4/32n"
"Routing Information Sources:n"
"Gateway         Distance      Last Updaten"
"192.168.61.100        90      00:33:51n"
"192.168.61.103        90      00:33:43")
m = re.search(pattern, s)
if m:
print(m.group(1).split("n"))

输出

['0.0.0.0/32', '5.6.4.3/24', '2.3.1.4/32']

为了进行更精确的匹配,并且如果可以有多个相同的连续部分,则可以匹配格式,并使用Routing断言而不是匹配:

Routing for Networks:n((?:(?:d{1,3}.){3}d{1,3}/d+n)+)(?=Routing)

示例

pattern = r"Routing for Networks:n((?:(?:d{1,3}.){3}d{1,3}/d+n)+)(?=Routing)"
s = "..."
m = re.search(pattern, s)
if m:
print([s for s in m.group(1).split("n") if s])

请参阅regex演示和Python演示。

最新更新