如何在Python中比较IPV6地址
我正在使用Python 2.6版本和Solaris 10操作系统
这里有一些有效的IPv6地址。我把这些IP地址存储为字符串。
- 2001:cdba:0000:0000:0000:0000:3257:9652
- 2001:cdba:0:0:0:0:3257:9652
- 2001:cdba::3257:9652
我需要比较这些IP地址,检查它们是否表示相同的IPv6地址(只是用不同的写法表示)。我搜索了很多,发现Python 3中有一些可用的类,比如ipaddress,但我不能使用,因为我用的是Python 2.6版本。请问在Python 2.6中有没有类似的类可以用呢?
谢谢
5 个回答
0
安装 ipaddr
import ipaddr
s1="2001:cdba:0000:0000:0000:0000:3257:9652"
ips=["2001:cdba:0:0:0:0:3257:9652","2001:cdba::3257:9652","2001:cdba:0000:0000:0000:0000:3257:9651"]
results=[]
for i in ips:
print ipaddr.IPv6Address(i).exploded # re adds leading zeros etc..
if ipaddr.IPv6Address(i).exploded==s1:
results.append(i)
print results
2001:cdba:0000:0000:0000:0000:3257:9652
2001:cdba:0000:0000:0000:0000:3257:9652
2001:cdba:0000:0000:0000:0000:3257:9651
['2001:cdba:0:0:0:0:3257:9652', '2001:cdba::3257:9652']
1
我会使用一些字符串处理的方法,比如
def pad(addr):
groups = addr.split(':')
empty = None
for i,g in enumerate(groups):
if empty is None and len(g) == 0: empty = i
elif len(g) < 4:
groups[i] = '0'*(4-len(g))+g
if empty is not None:
groups=groups[:empty] + ['0000',]*(8-len(groups)+1) + groups[empty+1:]
return ':'.join(groups)
if pad('2001:cdba:0000:0000:0000:0000:3257:9652') == pad('2001:cdba::3257:9652'):
print('Same!')
2
你可以使用 regex.sub
来处理字符串:
st_arr = ['2001:cdba:0000:0000:0000:0000:3257:9652', '2001:cdba:0:0:0:0:3257:9652', '2001:cdba::3257:9652']
new_string_arr = [re.sub(r'[:]+', ':', re.sub(':[0]+', ':', st))) for st in st_arr]
new_string_arr
Out[63]: ['2001:cdba:3257:9652', '2001:cdba:3257:9652', '2001:cdba:3257:9652']
new_string_arr[0] == new_string_arr[1] == new_string_arr[2]
Out[64]: True
首先,正则表达式会把模式 :[0]+
替换成 :
。这个模式的意思是找出一个冒号后面跟着一个或多个零。接着,因为可能会有多个冒号,所以我又把模式 [:]+
替换成 :
,这个模式是找出一个或多个冒号。
4
你可以使用套接字。
import socket
ip1 = "2001:cdba:0000:0000:0000:0000:3257:9652"
ip2 = "2001:cdba::3257:9652"
if socket.inet_pton(socket.AF_INET6, ip1) == socket.inet_pton(socket.AF_INET6, ip2):
print "match"
0
在比较IP地址之前,你可以先检查它们是否是有效的IPv6格式,可以使用socket库来完成这个检查:
import socket
def is_valid_ipv6_address(address):
try:
socket.inet_pton(socket.AF_INET6, address)
except socket.error: # not a valid address
return False
return True
经过验证后,现在你可以使用正则表达式来比较它们是否相等,需要对所有的IPv6地址进行遍历:
if(is_valid_ipv6_address(ipv6Address)):
new_ipv6Address=re.sub(r'::[0]', '::',re.sub(r'[::]+', '::', re.sub(':[0]+:', '::', re.sub(':[0]+:', '::', ipv6Address))))
这个方法适用于格式为aaaa:bbbb:cccc:dddd:eeee:ffff:1111::和aaaa:bbbb:cccc:dddd:eeee:ffff:1111:0的地址。