正则表达式包含和排除某些IP

时间:2017-05-04 17:10:52

标签: python regex python-2.7 parsing

我有一个功能的python 2.7代码,用于从路由表中提取IP。它仅以x.x.x.x / xx格式提取ip。但是我确实排除了路由表中的一些行。

例如,这一行:

D       10.50.80.0/24 [90/3072] via 10.10.10.1, 3w6d, Vlan10

在这一行中我所关心的只是10.50.80.0/24。因为这是唯一带有/ 24表示法的ip,所以我只能抓住它并且在没有/的情况下使用正则表达式忽略onces(例如,10.10.10.1)。但在表中,我们有2个以下异常:

     10.10.60.0/16 is variably subnetted, 58 subnets, 4 masks
C       10.10.140.0/24 is directly connected, Vlan240

我想在第二行(10.10.140.0/24)但不是第一行(10.10.60.0/16)捕获IP。该程序正在提取IP并检查表中是否有可用的子网。 10.10.60.0/16是问题,因为它不是说10.10.60.0/16在表中,而只是说这个子网有可变的子网。

目前我的工具正在捕获此IP并标记整个10.10.60.0/16范围,如表中所示,这是不正确的。我尝试了一些正则表达式编辑,但对它并不满意。我不小心想要意外地跳过任何子网,尤其是与第一行类似的第二行。捕获所有正确的子网非常重要。

有人可以建议最好的正则表达式编辑来完成此任务。只跳过 x.x.x.x / xx具有可变子网划分的行,x子网,x掩码

这是我目前的代码:

match = re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\/(?:[\d]{1,3})', text)

由于 戴蒙

1 个答案:

答案 0 :(得分:2)

如果我的问题正确无误,您希望现有的正则表达式跳过任何后跟'可变子网划分的的IP /子网。这样你可以使用这个正则表达式:

(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\/(?:[\d]{1,3})\b(?! is variably)
  • 我在正则表达式的末尾添加了\b(?! is variably)
  • 最后的
  • \b表示字边界
  • (?! is variably)有一个负向前瞻(?!,可确保在IP /子网后不存在“可变”文本。

演示:https://regex101.com/r/jTu8cj/1

匹配

D       10.50.80.0/24 [90/3072] via 10.10.10.1, 3w6d, Vlan10
C       10.10.140.0/24 is directly connected, Vlan240

不匹配:

10.10.60.0/16 is variably subnetted, 58 subnets, 4 masks
255.255.255.1
相关问题