Python-ip<-&燃气轮机;子网匹配?

Python-ip<-&燃气轮机;子网匹配?,python,ip,subnet,Python,Ip,Subnet,可能重复: 在python中,将子网与ip地址匹配的简单方法是什么,这样,如果ip地址在子网中,我就可以选择它了 提前感谢。在Python 3.3+中,您可以使用模块: 如果Python安装版本早于3.3,则可以使用 如果您想以这种方式评估许多IP地址,您可能需要预先计算网络掩码,如 n = ipaddress.ip_network('192.0.0.0/16') netw = int(n.network_address) mask = int(n.netmask) 然后,对于每个地址,使

可能重复:

在python中,将子网与ip地址匹配的简单方法是什么,这样,如果ip地址在子网中,我就可以选择它了


提前感谢。

在Python 3.3+中,您可以使用模块:

如果Python安装版本早于3.3,则可以使用


如果您想以这种方式评估许多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

如果要从一长串前缀中查找给定IP的前缀,则可以实现。首先根据前缀列表构建一个树,然后遍历树以查找与前缀匹配的最远的叶


这听起来很吓人,但也没那么糟糕:)

真的不清楚你在问什么。您选择的是IP还是子网?问题是“我如何判断IP地址是否在特定子网中?”还是什么?无论如何,为了更有效地处理一组庞大的表,如何做到这一点?例如,我有一个大约100000个这样的表:)@EiyrioüvonKauyf也更新了该案例的答案。第二种方法,预先计算网络掩码,似乎不起作用。我遵循了确切的步骤,最后,网络中的
False
。我正在使用模块的端口连接到2.6和2.7。使用
ipaddr
()是相同的:对于上面的示例,产生一个False。请注意,我直接导入了
py
模块文件,而没有运行
setup.py
,我认为这不是一个问题。@Causality很棒!通过切换到ints进行修复。@BelminFernandez谢谢,我已经在答案中添加了backport(由您的Really;))。
in_network = (a & mask) == netw