Python正则表达式将IP地址与/ CIDR匹配

时间:2010-11-19 20:48:30

标签: python regex pattern-matching ip-address cidr

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

如何对其进行修改,使其不仅与IPv4匹配,还与10.10.10.0/24等CIDR匹配?

8 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

答案 2 :(得分:1)

\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

答案 3 :(得分: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

答案 4 :(得分:0)

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

这样可以获得r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1,2})?"模式。

答案 5 :(得分:0)

这扩展了现有的表达式

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

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