使用regex再次扫描一行并重新扫描该行

2024-05-29 02:38:31 发布

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

在这个句子中,如果我想跟踪两个IP,我可以扫描句子直到找到第一个IP,捕获IP,扫描句子直到第二个,除了IP之外的所有字符都可以“丢弃”,因为我不需要它。以下是行:

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地址,并将其存储在字典中供以后使用。你知道吗


Tags: ofto字符串程序ipisnetwork字符
3条回答

如果只想从这些字符串序列中捕获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解析库。你知道吗

在正则表达式中,必须对点\.进行转义才能按字面意思匹配,否则点.将匹配任何字符。你知道吗

^{} 或更短的^{}

注意

虽然这与示例中的数字和点匹配,但这不是一个匹配ip号的正则表达式。也许this page会有帮助。你知道吗

您可以配对,每行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)

相关问题 更多 >

    热门问题