正则表达式以一系列字符串捕获 IP 地址 + /子网格式并将每个匹配项分配给一个组

Regex capturing IP Address + /subnet format in series of strings and assign each match to a Group

我已经找到了我可以在这个网站上找到的所有有助于在给定字符串中挑选出 IP 地址的帖子 - 以及对我来说绝对最有效的帖子我修改了它以获取 /xx 子网信息在最后。例如 192.168.1.1/24

什么不起作用 - 是我需要将每个 IP 匹配项放入一个组中...但是我发现的每个示例都使它们成为非捕获组 ?: 这对我来说没用,因为我无法开始获取结果以添加到电子表格中 - 我正在使用 Python.

所以:

(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?/\d{1,2})

运行 针对此字符串:

blah blah  16.13.129.128/25  blah blah 18.83.130.0/24  blah blah  18.18.141.0/24  blah blah 10.17.14.0/24

确实匹配每个 IP :

16.13.129.128/25  
18.83.130.0/24  
18.18.141.0/24  
10.17.14.0/24  

但我不能将每个 IP 称为 Group0、Group1、Group2 等...对于每场比赛。我真的不明白 ?: 在做什么(除了使其成为非捕获组之外)-但是当我删除所有 ?: 以为它们会变成捕获组时-绝对谋杀了正则表达式并且找不到IP 了。我已经使用了几个正则表达式调试站点来确认这些发现——但我不知道为什么它会完全崩溃 当刚刚放下 ?:

有谁知道如何调整相同的正则表达式以允许将每个 IP 分配给捕获组,例如:

Group0: 16.13.129.128/25  
Group1: 18.83.130.0/24  
Group2: 18.18.141.0/24  
Group3: 10.17.14.0/24  

为什么?捕获组命名单个匹配项,因此这不是您所需要的。 只需使用 findall 并将它们放在一个列表中,您可以通过索引枚举或引用:

import re

ipr = re.compile(r'(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?/\d{1,2})')
s = 'blah blah 16.13.129.128/25 blah blah 18.83.130.0/24 blah blah 18.18.141.0/24 blah blah 10.17.14.0/24'

ips = ipr.findall(s)
for i,ip in enumerate(ips):
    print(f'ips[{i}] = {ip}')

输出:

ips[0] = 16.13.129.128/25
ips[1] = 18.83.130.0/24
ips[2] = 18.18.141.0/24
ips[3] = 10.17.14.0/24