可能重复:
How can I check if an ip is in a network in pythonPython - ip <->子网?
什么是最简单的方式,以匹配子网在Python一个IP地址,因此,如果IP地址所在的子网我可以选择呢?
在此先感谢。
可能重复:
How can I check if an ip is in a network in pythonPython - ip <->子网?
什么是最简单的方式,以匹配子网在Python一个IP地址,因此,如果IP地址所在的子网我可以选择呢?
在此先感谢。
在Python 3.3+,您可以使用ipaddress模块:
>>> import ipaddress
>>> ipaddress.ip_address('192.0.43.10') in ipaddress.ip_network('192.0.0.0/16')
True
如果你的Python安装比3.3老,你可以使用this backport。
如果要评估很多IP地址这种方式,你可能要计算的网络掩码前期,像
n = ipaddress.ip_network('192.0.0.0/16')
netw = int(n.network_address)
mask = int(n.netmask)
然后,对于每个地址,计算二进制与
a = int(ipaddress.ip_address('192.0.43.10'))
a = struct.unpack('!I', socket.inet_pton(socket.AF_INET, '192.0.43.10'))[0]
a = struct.unpack('!I', socket.inet_aton('192.0.43.10'))[0] # IPv4 only
最后一个代表,你可以简单地检查:
in_network = (a & mask) == netw
无论如何要做到这一点更有效地为一组巨大的表?恩。我有一个约10万个这样的表格:) – 2012-11-30 18:20:19
@EiyrioüvonKauyf更新了该案例的答案。 – phihag 2012-11-30 18:43:31
非常感谢:) – 2012-11-30 21:03:33
如果对于给定的IP,您希望从长长的前缀列表中找到前缀,那么您可以实现longest prefix match。你首先从你的前缀列表中建立一个prefix tree,然后你遍历树寻找最匹配你的前缀的树叶。
这听起来很可怕,但它不是很差:)
这真的不清楚你在问什么。你选择什么,IP或子网?问题是“如何知道IP地址是否在特定的子网中?”或者是什么? – 2012-03-15 09:41:26