2017-05-04 155 views
0

我有一个函数python 2.7代码,从路由表中提取IP。它只提取x.x.x.x/xx格式的ip。不过,我确实有一个问题,排除路由表中的一些行。正则表达式来包含和排除某些IP

例如,该行:

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

在该行的所有我关心的是10.50.80.0/24。由于这是唯一具有/ 24符号的ip,所以我只能抓住它并让正则表达式忽略没有/(例如10.10.10.1)的onces。但在表中,我们有以下2种异常:

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

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

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

有人可以建议一个最佳的正则表达式编辑来实现这一点。只有跳过某个具有线XXXX/XX是可变的子网,X子网,X口罩

这里是我当前的代码:

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

感谢 达蒙

+0

这看起来像'Cisco设备上显示IP route'输出 - 实际表格中的路线(即不是摘要)总是有一个字母作为表示路线起点的第一个字符(静态,连接,OSPF,EIGRP等)。你可以放弃以空格开始的行,或者只查看以几个可能的字母开头的行('show ip route'告诉你什么是可能的)。 – Ben

+0

这是一个很好的解决方案,但由于意外的空间或某种原因,它有可能会错过实际的IP。我相信底部解决方案更安全。 – Damon

回答

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 
+0

工作正常。我有类似的东西,但没有\ b。 – Damon