我正在使用 python --version 2.6和Solaris 10作为操作系统
这些是一些有效的IPV6地址。我将这些IP地址设为字符串。
我必须比较所有ip并检查它们是否代表相同的ipv6地址(表示为不同的表示法)。我已经搜索了很多,并在python 3中找到了一些像ipaddress一样的类,但我不能使用它,因为我有python 2.6版本。在python 2.6中有没有可用的类?
由于
答案 0 :(得分:3)
您可以使用套接字。
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"
答案 1 :(得分: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]+
替换为:
,之后由于可能有多个冒号,我将模式[:]+
替换为:
。
答案 2 :(得分: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']
答案 3 :(得分:0)
在比较ipaddress之前,你可以使用socket lib检查它们是否是有效的ipv6格式:
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格式。
答案 4 :(得分:0)
我只会使用一些字符串操作,例如
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!')