Python 正则表达式将 IP 地址与 /CIDR 进行匹配
m = re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",s)
如何修改它,使其不仅匹配 IPv4,还匹配 CIDR(例如 10.10.10.0/24
)?
m = re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",s)
How do I modify it so it will match not only IPv4, but also something with CIDR like 10.10.10.0/24
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
在 Expresso 中测试
匹配:
Tested in Expresso
Matched:
ReGex(带/不带 CIDR 的 ip_address )
试试这个:
输出:
ReGex ( ip_address with/without CIDR )
try this:
output:
我在使用与您类似的正则表达式时遇到问题。它匹配 1.2.3.4.5(如 1.2.3.4)和 1111.2.3.4(如 111.2.3.4)。为了避免匹配这些,我添加了前瞻/后瞻断言:
(? 检查前面是否没有数字或八位字节你的第一个八位字节(即: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
I had problems using a regex similar to yours. It was matching 1.2.3.4.5 (as 1.2.3.4) and 1111.2.3.4 (as 111.2.3.4). To avoid matching these, I added look ahead/behind assertions:
The
(?<!\d\.)(?<!\d)
checks that there isn't a number or octet before your first octet (ie: no 1 before 111.2.3.4).And
(?!\d|(?:\.\d))
checks that there isn't a number/octet after your last (ie: no .5 after 1.2.3.4).Then, to check that the strings these match are valid IPs (eg: not 277.1.1.1), you can use
socket.inet_aton(ip) #raises exception if IP is invalid
刚刚做了一个非常好的正则表达式,它还检查 ip 格式的正确性,不是太长,并且可以选择匹配子网长度:
Just did a really nice regex that also checks the ip format correctness, isn't to long, and matches subnet length optionally:
netaddr的ip模块中有一个
all_matching_cidrs(ip, cidrs)
函数;它需要一个 IP 并将其与 CIDR 地址列表进行匹配。There is an
all_matching_cidrs(ip, cidrs)
function in netaddr's ip module; it takes an ip and matches it with a list of CIDR addresses.这扩展了你现有的表达方式
this extends your existing expression
附加
"(?:/\d{1,2})?"
。这让你
r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1 ,2})?"
表示模式。Append
"(?:/\d{1,2})?"
.That gets you
r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:/\d{1,2})?"
for a pattern.我找到的最佳答案是:
Best answer I found is: