Python 正则表达式匹配具有前缀长度的 ip 地址

Python regex to match ip address with prefix length

我需要一个匹配以下模式的正则表达式 a.b.c.d /nn,例如 192.168.0.24 /32.

同时我想做一些验证,所以在八位字节中,第一个数字只能是 1 或 2,如果最后 3 个八位字节只包含 1 个数字,它也可以是 0。此外,八位字节的数量应最多为 255。与 /nn 类似,第一位只能从 1 到 3,但如果是 3,则第二位应从 0 到 2,如果第一位是缺席,那么唯一的数字应该是从 1 到 9。

我可以这样写模式

(?<!\d)(?!0|4|5|6|7|8|9)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} +/(?<!\d)(?!0|4|5|6|7|8|9)\d{1,2}

但是例如 192.168.740.056 /39 也匹配它。

这对你有用吗?

def find_ips(ip_string):
    for match in re.finditer(r'(?P<ip>[12]\d*\.\d+\.\d+\.\d+)\s+/(?P<mask>\d+)', ip_string):
        octets = list(map(int, match.group('ip').split('.')))
        if all(0 <= octet <= 255 for octet in octets) and int(match.group('mask')) <= 32 and octets[-1] > 0:
            yield match.group()

# ips = ['192.168.0.1 /32', '22.22.22.22 /32']
ips = list(find_ips("ip1=8.8.8.8 /32; ip2=192.168.0.1 /32; ip3=22.22.22.22 /32; ip4=192.168.740.056 /39"))