【发布时间】:2017-10-02 23:50:57
【问题描述】:
我有一个从路由表中提取 IP 的功能性 python 2.7 代码。它只提取 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,我只能抓住它并让正则表达式忽略不带 / 的一次(例如,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)
谢谢 达蒙
【问题讨论】:
-
这看起来像 Cisco 设备上
show ip route的输出 - 表中的实际路由(即不是摘要)总是有一个字母作为第一个字符来指示路由的来源(静态、已连接、OSPF、EIGRP 等)。您可以丢弃以空格开头的行,或者只查看以少数可能的字母开头的行(show ip route告诉您什么是可能的)。 -
这是一个很好的解决方案,但由于意外空间或其他原因,它可能会错过实际 IP。我相信底层解决方案更安全。
标签: python regex python-2.7 parsing