想象一下,我們有一個像這樣的字串:
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)
uj5u.com熱心網友回復:
捕獲組 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/32\n"
"5.6.4.3/24\n"
"2.3.1.4/32\n"
"Routing Information Sources:\n"
"Gateway Distance Last Update\n"
"192.168.61.100 90 00:33:51\n"
"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])
請參閱正則運算式演示和Python 演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/386001.html
