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

我该如何修改它,使它不仅匹配 IPv4,而且匹配 CIDR 之类的东西10.10.10.0/24

4

8 回答 8

5

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

于 2010-11-19T20:53:12.447 回答
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
于 2011-04-13T21:51:55.730 回答
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)第一个八位字节之前没有数字或八位字节(即:111.2.3.4 之前没有 1)。并(?!\d|(?:\.\d))检查最后一个之后是否没有数字/八位字节(即:1.2.3.4 之后没有 .5)。

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

socket.inet_aton(ip) #raises exception if IP is invalid

于 2011-12-21T14:33:05.407 回答
1

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

(25[0-5]|2[0-4]\d|1\d\d|\d\d|\d).(?1).(?1).(?1)\/?(\d\d)?
于 2019-05-25T07:00:20.207 回答
1

正则表达式(带/不带 CIDR 的 ip_address )

尝试这个:

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)

输出:

是的,IP 地址 0.0.0.0/0 是正确的

是的,IP 地址 255.255.255.255/21 是正确的

是的,IP 地址 17.2.5.0/21 是正确的

是的,IP 地址 29.29.206.99 是正确的

不,IP 地址不正确

于 2021-08-21T06:30:22.063 回答
0

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

于 2012-06-01T22:11:17.620 回答
0

这扩展了您现有的表达式

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\\\d{1,2}
于 2010-11-19T20:52:59.730 回答
0

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

这让你r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1,2})?"有一个模式。

于 2010-11-19T20:51:26.737 回答