我有一个功能的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)
由于 戴蒙
答案 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