2014-06-07 7 views
1

J'utilise python --version 2.6 et Solaris 10 comme OSComment comparer les adresses IPV6 en python

Voici quelques adresses IPV6 valides. J'ai ces adresses Ip comme chaîne.

  • 2001: CDBA: 0000: 0000: 0000: 0000: 3257: 9652
  • 2001: CDBA: 0: 0: 0: 0: 3257: 9652
  • 2001: CDBA :: 3257: 9652

je dois comparer tous les IP et vérifier que si elles sont représentant même adresse ipv6 (représentée comme notation différente) ou non. J'ai beaucoup cherché, et trouve des classes disponibles en python 3 comme ipaddress, mais je ne peux pas l'utiliser car j'ai une version python 2.6. Y at-il une classe disponible en python 2.6?

Merci

+0

même ipv6 quoi? Région? Sous-réseau? –

+0

Je dois comparer toutes les adresses ipv6 qui sont identiques et représentées sous une notation différente. – user3717431

+0

et quelles sont ces "notations"? Juste ces 3 dans le post? Divisez vos chaînes et supprimez les zéros en tête et vous avez alors une représentation uniforme. – lejlot

Répondre

0

Avant de comparer ipaddress vous pouvez vérifier si elles sont au format ipv6 valides ou non, en utilisant socket lib:

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 

après validatation vous pouvez maintenant utiliser des expressions régulières pour comparer si elles sont égales ou non itérer pour toutes les adresses ipv6,:

if(is_valid_ipv6_address(ipv6Address)): 
    new_ipv6Address=re.sub(r'::[0]', '::',re.sub(r'[::]+', '::', re.sub(':[0]+:', '::', re.sub(':[0]+:', '::', ipv6Address)))) 

Cela fonctionne pour AAAA: bbbb: cccc: dddd: eeee: ffff: 1111 :: et AAAA: bbbb: cccc: dddd: eeee: ffff: 1111: 0 Format ainsi que.

+0

Je pense qu'il est bon de vérifier si c'est un adresse IP valide ou non, puis comparez ... – user3717431

0

Installez 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'] 
2

Vous pouvez utiliser 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 

d'abord l'expression rationnelle remplace le modèle :[0]+ avec : et après cela, car il pourrait y avoir plusieurs colons, je remplacé le motif [:]+ par .

+0

il ne fonctionne pas avec aaaa: bbbb: cccc: dddd: eeee: ffff: 1111 :: et aaaa: bbbb: cccc: dddd: eeee: ffff: notation 1111: 0 – user3717431

+0

@ user3717431: J'ai mis à jour ma réponse. Ça fonctionne maintenant. –

+0

@AnkurAnkan Votre réponse serait, AFAICS, traiter '' 2001: cdba: 0000: 0000: 0000: 0000: 3257: 9652'' et '' 2001: cdba: 0000: 0000: 0000: 3257: 0000: 9652'' même... – glglgl

0

Je voudrais simplement utiliser quelques manipulations de chaînes telles que

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!') 
1

Vous pouvez utiliser le socket.

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"