【问题标题】:Python Repeated Capture GroupsPython 重复捕获组
【发布时间】:2013-04-09 17:04:20
【问题描述】:

我正在尝试解析一系列 SHOW CDP NEIGHBORS DETAIL 输出,以便捕获每个设备及其 IP 地址。

我遇到的问题是某些设备可能分配了多个 IP 地址,这是一个示例输出。

Device ID: RTPER1.MFN21Mb.domain.local
Entry address(es): 
  IP address: 200.152.51.3
  IP address: 82.159.177.233
  IP address: 201.152.51.140
  IP address: 84.252.100.3
Platform: Cisco 2821,  Capabilities: Router Switch IGMP 

我写了这个正则表达式来捕获输入,根据 gskinner 它匹配所有 4 个 ip 地址,但捕获只是最后一个(正如正则表达式所预期的那样)

Device ID: ([0-9A-Za-z-.&]+)\s+Entry address\(es\):\s+(?:IP address: ([0-9.]+)\s+)+

所以我上网想知道如何做到这一点。我尝试了这里建议的正则表达式Capturing repeating subpatterns in Python regex,但使用正则表达式模块并没有改变输出。我仍然只得到列表中的最后一个 ip 地址,其他的都没有。

按照我得到的例子

temp = regex.match(r'Device ID: ([0-9A-Za-z-.&]+)\s+Entry address\(es\):\s+(?:IP address: ([0-9.]+)\s+)+', file)
print temp

Temp 返回无。

如果我确实找到了。我只返回最后一个 ip 地址 84.252.100.3

如果我添加多个捕获组,例如

temp = regex.findall(r'Device ID: ([0-9A-Za-z-.&]+)\s+Entry address\(es\):\s+(?:IP address: ([0-9.]+)\s+)?\s+(?:IP address: ([0-9.]+)\s+)?\s+(?:IP address: ([0-9.]+)\s+)?\s+(?:IP address: ([0-9.]+)\s+)?\s+(?:IP address: ([0-9.]+)\s+)?', file)
print temp

它只匹配具有多个 ip 地址的那些,而不匹配其他的

希望有人可以提供帮助。

【问题讨论】:

  • 您确定您严格按照示例进行操作吗? (正则表达式模块)
  • @nhahtdh 我用收到的回复更新了我的帖子
  • 使用search 而不是matchmatch 总是从字符串的开头开始。

标签: python regex


【解决方案1】:

据我所知,只有 .NET 允许您遍历量化(重复)捕获组。考虑这个(有限的)替代方案:

Device ID: ([0-9A-Za-z-.&]+)\s+Entry address\(es\):\s+(?:IP address: ([0-9.]+)\s+)(?:IP address: ([0-9.]+)\s+)?(?:IP address: ([0-9.]+)\s+)?(?:IP address: ([0-9.]+)\s+)?
                                                                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

这将在$2 中捕获最多1 个IP 地址,在$3$4$5 中最多捕获三个IP 地址。 (当然,我习惯性地使用$ 表示法。)您可以根据需要添加任意数量。如果您需要将所有 IP 地址显示在一个组中, $2,那么您唯一的选择就是在其中包含文本:

Device ID: ([0-9A-Za-z-.&]+)\s+Entry address\(es\):\s+((?:IP address: (?:[0-9.]+)\s+)+)
                                                      ^                ^^             ^

【讨论】:

  • 我自己没有使用过,但 Python regex 模块似乎允许获取由重复的组捕获的文本列表,根据 OP 链接到的问题中的答案. (无论如何,第一个选项甚至不是一个选项,IMO,因为你施加了一个上限)
  • @nhahtdh - 啊,我的错。我只看了第一个答案,我自己对 Python 并不熟悉。我从过去的正则表达式讨论中认出了你的名字。因此,恕我直言,我不认为施加上限会使选项无效。特别是在(现在发现是不正确的)前提下,没有其他方法,能够指定一个可以捕获多达 100 个 IP 地址的正则表达式,对于 OP 的实际需求可能绰绰有余。
  • 我认为在您的帖子中使用第二个选项更实用(获取整个同质数据块并使用第二遍提取它)。我的意图是不鼓励使用第一种方法,除非它是一次性业务。
  • 我会接受这个答案作为解决方案,因为它倾向于回答我想知道的问题。遗憾的是 python 不支持重复捕获组,但幸运的是有一个解决方法。与 nhahtdh 建议一样,我采用了整个块,然后再次解析它,这样,如果某些服务器的 IP 地址超过 5 个,我仍然可以全部获取。感谢您的帮助。
猜你喜欢
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多