如何比较python中的IPV6地址

时间:2014-06-07 09:49:25

标签: python compare ip-address

我正在使用 python --version 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 :(得分: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!')