我试图解析一系列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尝试了regex建议,但是使用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返回None。

如果我找到了。我得到的只是最后一个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地址的地址,而不匹配其他IP地址的地址

希望有人可以提供帮助。

最佳答案

据我所知,只有.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 - Python重复捕获组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15908085/

10-15 04:17