【问题标题】:Regex to include and exclude certain IPs正则表达式包含和排除某些 IP
【发布时间】: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


【解决方案1】:

如果我正确地回答了您的问题,您希望您现有的正则表达式跳过任何紧随其后的 IP/子网 'is variably subnetted'。这样做你可以使用这个正则表达式:

(?:[\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

【讨论】:

  • 工作正常。我有类似的东西,但没有 \b。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多