2015-11-27 7 views
3

У меня есть следующая задача:Любой лучший способ проверить строку для действительных IPv4 и IPv6?

Определите, имеет ли строка действительный адрес IPv4 или IPv6, используя только модули по умолчанию. Я нашел интересный способ использования модуля сокета здесь он:

import socket 

ip = '10.1.0.10' 
try: 
    # test for IPv4 
    socket.inet_pton(socket.AF_INET, ip) 
except socket.error: 
    try: 
     # test for IPv6 
     socket.inet_pton(socket.AF_INET6, ip) 
    except socket.error: 
     print(ip, " is not valid") 

кажется уродливым, чтобы попробовать под попробовать в таком случае, есть ли лучший способ? Есть ли другой модуль, который мог бы сделать то же самое лучше, учитывая тот факт, что мне нужно проверить около 100 IP-адресов.

+3

Это не плохо, хотя. –

+0

Достаточно ли простого регулярного выражения (http://www.regextester.com/22)? – fhelwanger

+0

Имея действительный: вы имеете в виду, что существует узел с IP-адресом или вы можете настроить узел с этим адресом. В конце концов выделяется только подмножество разрешенных IP-адресов. –

ответ

6

Вы можете использовать модуль ipaddress. Документацию можно найти здесь: https://docs.python.org/3/library/ipaddress.html

Пример кода:

>>> ipaddress.ip_address('192.168.0.1') 
IPv4Address('192.168.0.1') 
>>> ipaddress.ip_address('2001:db8::') 
IPv6Address('2001:db8::') 
>>> ipaddress.ip_address('323.4.7.8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python3.4/ipaddress.py", line 54, in ip_address 
    address) 
ValueError: '323.4.7.8' does not appear to be an IPv4 or IPv6 address 
>>> ipaddress.ip_address('ffff::4543:1f1f::134') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python3.4/ipaddress.py", line 54, in ip_address 
    address) 
ValueError: 'ffff::4543:1f1f::134' does not appear to be an IPv4 or IPv6 address 
+1

Не в Python 2.x Я полагаю? –

+0

Фактически он был обращен к 2.6 –

+0

, который был бы приятным, за исключением того, что он не является частью модулей по умолчанию. Мне нужно использовать python2 – Attila