如何在Python中比较IPV6地址

1 投票
5 回答
2984 浏览
提问于 2025-04-18 08:57

我正在使用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的地址。

撰写回答