Python重复捕获组

时间:2013-04-09 17:04:20

标签: python regex

我正在尝试解析一系列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返回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地址的那些,而不是其他的

希望有人可以提供帮助。

1 个答案:

答案 0 :(得分: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中捕获最多3个IP地址。 (当然,我正在惯用$符号。)您可以添加任意数量的符号。如果您需要将所有IP地址存在于一个组中, $2,那么您唯一的选择是将文本包含在其中:

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