扫描一行并使用正则表达式重新扫描该行

时间:2018-01-23 15:47:45

标签: python regex

在这句话中,如果我想跟踪两个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地址并将其存储在字典中以供日后使用。

3 个答案:

答案 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)