在这句话中,如果我想跟踪两个IP,我可以扫描句子,直到找到第一个IP,捕获IP,扫描句子直到第二个,除了IP之外的所有字符都可以"丢弃& #34;因为我不需要它。以下是这些行:
Gateway of last resort is 10.119.254.240 to network 10.140.0.0
O E2 10.110.0.0 [160/5] via 10.119.254.6, 0:01:00, Ethernet2
**D 10.67.10.0 [200/128] via 10.119.254.244, 0:02:22, Ethernet2**
O E2 10.68.132.0 [160/5] via 10.119.254.6, 0:00:59, Ethernet2
我现在拥有的正则表达式是:
[0-9] +(?:[0-9] +){3}
这是从要在不同部分中使用的字符串中提取与其对应的IP地址的程序的一部分。程序的输出应该是这样的:
Protocol: EIGRP
Prefix: 10.67.10.0
AD/Metric:200/128
Next-Hop:10.119.254.244
Last Update:0:02:22
Outbound interface: Ethernet2
我的想法是我认为我可以提取IP地址并将其存储在字典中以供日后使用。
答案 0 :(得分:0)
如果您只想捕获这些字符串序列中的IP地址,可以使用以下正则表达式:
>>> import re
>>> f = lambda s: re.findall(r'\d+\.\d+\.\d+\.\d+', s)
>>> f("Gateway of last resort is 10.119.254.240 to network 10.140.0.0")
['10.119.254.240', '10.140.0.0']
>>> f("O E2 10.68.132.0 [160/5] via 10.119.254.6, 0:00:59, Ethernet2")
['10.68.132.0', '10.119.254.6']
免责声明:我建议不要使用这种解析IP地址的方法,因为字符串可能会受到严重污染并导致各种边缘情况。我建议对任何类型的生产代码使用IP解析库。
答案 1 :(得分:0)
在你的正则表达式中,你必须转义点\.
以使其与字面匹配,否则点.
将匹配任何字符。
[0-9]+(?:\.[0-9]+){3}
或更短\d+(?:\.\d+){3}
注意强>
虽然这与示例中的数字和点匹配,但这不是匹配ip号的正则表达式。也许this page可能会有所帮助。
答案 2 :(得分:0)
你可以成对匹配,每场比赛每对1对 第1组是第一次ip,第2组是第二次ip。
((?:[01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])){3})(?!\S).+?(?<!\S)((?:[01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])(?:\.(?:[01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])){3})
https://regex101.com/r/KUzfz0/1
格式化
( # (1 start), 1st IP
(?:
[01]? [0-9]? [0-9]
| 2 [0-4] [0-9]
| 25 [0-5]
)
(?:
\.
(?:
[01]? [0-9]? [0-9]
| 2 [0-4] [0-9]
| 25 [0-5]
)
){3}
) # (1 end)
(?! \S ) # Wsp boundary ahead
.+? # Stuff inbetween
(?<! \S ) # Wsp boundary behind
( # (2 start), 2nd IP
(?:
[01]? [0-9]? [0-9]
| 2 [0-4] [0-9]
| 25 [0-5]
)
(?:
\.
(?:
[01]? [0-9]? [0-9]
| 2 [0-4] [0-9]
| 25 [0-5]
)
){3}
) # (2 end)