是否有任何现有的库来解析字符串作为IPv4或IPv6地址,或者至少确定一个字符串是否是(任排序)的IP地址?
Answer 1:
是的,有ipaddr
模块,可以帮助你检查一个字符串是的IPv4 / IPv6地址,并检测它的版本。
import ipaddr
import sys
try:
ip = ipaddr.IPAddress(sys.argv[1])
print '%s is a correct IP%s address.' % (ip, ip.version)
except ValueError:
print 'address/netmask is invalid: %s' % sys.argv[1]
except:
print 'Usage : %s ip' % sys.argv[0]
但是,这不是一个标准的模块,所以它并不总是能够使用它。 您还可以尝试使用标准的socket
模块:
import socket
try:
socket.inet_aton(addr)
print "ipv4 address"
except socket.error:
print "not ipv4 address"
对于IPv6地址时,必须使用socket.inet_pton(socket.AF_INET6, address)
。
我也想指出,这inet_aton
将尝试转换(真正将其转换)地址像10
, 127
等等,这看起来不像IP地址。
Answer 2:
对于IPv4,您可以使用
socket.inet_aton(some_string)
如果它抛出一个异常, some_string
是不是一个有效的IP地址
对于IPv6,您可以使用:
socket.inet_pton(socket.AF_INET6, some_string)
再次,它抛出一个异常,如果some_string
是不是一个有效的地址。
Answer 3:
的IPv4 + IPv6解决方案仅仅依靠标准库。 返回4
或6
或引发ValueError
。
try:
# Python 3.3+
import ipaddress
def ip_kind(addr):
return ipaddress.ip_address(addr).version
except ImportError:
# Fallback
import socket
def ip_kind(addr):
try:
socket.inet_aton(addr)
return 4
except socket.error: pass
try:
socket.inet_pton(socket.AF_INET6, addr)
return 6
except socket.error: pass
raise ValueError(addr)
Answer 4:
您可以使用netaddr
库。 它有valid_ipv4 / valid_ipv6方法:
import netaddr
if netaddr.valid_ipv4(str_ip) is True:
print("IP is IPv4")
else:
if netaddr.valid_ipv6(str_ip) is True:
print("IP is IPv6")
Answer 5:
IPADDR -谷歌的IP地址操纵包。
需要注意的是一个提案,包括包中的Python标准库最近被接受(见的修订版PEP 3144 )。
Answer 6:
尝试
apt-get install python-ipaddr
或者从源代码在这里
Answer 7:
如果你肯定知道该地址是有效的,只是想确定它是否是IPv4或IPv6,是不是足以只是做:
if ":" in address:
print("Ipv6")
else:
print("Ipv4")
Answer 8:
我喜欢ip_interface因为它处理的情况下既没有前缀的面膜,例如,既有“10.1.1.1/24”,以及简单的“10.1.1.1”。 不用说,既适用于V4和V6
from ipaddress import ip_interface
ip_interface("10.1.1.1/24").ip
ip_interface("10.1.1.1/24").ip.version
ip_interface("10.1.1.1").ip
ip_interface("10.1.1.1").ip.version
文章来源: Checking for IP addresses