Python正则表达式匹配带有/CIDR的IP地址

8
m = re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",s)

我该如何修改它以匹配不仅是IPv4,还有CIDR(类似于10.10.10.0/24)的内容?

9个回答

5
(?:\d{1,3}\.){3}\d{1,3}(?:/\d\d?)?

400.123.34.56被匹配但不合法(但asdasdasd的正则表达式也有同样的问题) - Tim
1
只是提醒一下,在像Javascript这样的语言中,'/'可能需要转义。 - Dave

3
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1,2}|)

测试于Expresso

匹配:

64.33.232.212
64.33.232.212/30

1
netaddr的ip模块中有一个all_matching_cidrs(ip, cidrs)函数;它接受一个IP地址并将其与CIDR地址列表进行匹配。

1

ReGex(带/不带CIDR的IP地址)

尝试这个:

str1 = '0.0.0.0/0'
str2 = '255.255.255.255/21'
str3 = '17.2.5.0/21'
str4 = '29.29.206.99'
str5 = '265.265.20.20'

pattern = 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]?)([/][0-3][0-2]?|[/][1-2][0-9]|[/][0-9])?$"


def check_ip(user_input):
    match = re.search(pattern, user_input)
    if match:
        print(f"Yes, IP-address {match.string} is correct")
    else:
        print("No, IP-address is incorrect")


check_ip(str1)
check_ip(str2)
check_ip(str3)
check_ip(str4)
check_ip(str5)

输出:

Yes, IP-address 0.0.0.0/0 is correct

Yes, IP-address 255.255.255.255/21 is correct

Yes, IP-address 17.2.5.0/21 is correct

Yes, IP-address 29.29.206.99 is correct

No, IP-address is incorrect

1

我在使用类似于你的正则表达式时遇到了问题。它将1.2.3.4.5(作为1.2.3.4)和1111.2.3.4(作为111.2.3.4)进行匹配。为了避免这些匹配,我添加了前后环视断言:

IP_RE      = re.compile(r"(?<!\d\.)(?<!\d)(?:\d{1,3}\.){3}\d{1,3}(?!\d|(?:\.\d))")
IP_CIDR_RE = re.compile(r"(?<!\d\.)(?<!\d)(?:\d{1,3}\.){3}\d{1,3}/\d{1,2}(?!\d|(?:\.\d))")

(?<!\d\.)(?<!\d) 检查第一个 octet 前面是否存在数字或八进制数(即 111.2.3.4 前没有 1)。 而 (?!\d|(?:\.\d)) 检查最后一个 octet 后面是否存在数字或八进制数(即 1.2.3.4 后没有 .5)。

然后,要检查这些匹配的字符串是否是有效的 IP(例如不是 277.1.1.1),您可以使用

socket.inet_aton(ip) # 如果 IP 无效则引发异常


1

我刚刚完成了一个非常好的正则表达式,它还检查IP格式的正确性,长度不会太长,并且可以选择匹配子网长度:

(25[0-5]|2[0-4]\d|1\d\d|\d\d|\d).(?1).(?1).(?1)\/?(\d\d)?

更好的写法是:'\b(25[0-5]|2[0-4]\d\b|1\d\d|\d\d|\d)\b.\b(?1)\b.\b(?1)\b.\b(?1)\b\b(/\d\d|/\d)?\b' - Mariosti

0

添加 "(?:/\d{1,2})?"

这将为您提供一个模式:r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1,2})?"


0

我找到的最佳答案是:

^([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))?$

0

这将扩展您现有的表达式

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\\\d{1,2}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接