m = re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",s)
如何对其进行修改,使其不仅与IPv4匹配,还与10.10.10.0/24
等CIDR匹配?
答案 0 :(得分:3)
(?:\d{1,3}\.){3}\d{1,3}(?:/\d\d?)?
答案 1 :(得分:1)
答案 2 :(得分:1)
答案 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)?