是否有任何现有的库可以将字符串解析为 ipv4 或 ipv6 地址,或者至少识别字符串是否是 IP 地址(任何一种)?
问问题
25823 次
8 回答
17
是的,有一个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 地址。
于 2012-08-06T12:09:46.383 回答
9
对于 IPv4,您可以使用
socket.inet_aton(some_string)
如果它抛出异常,some_string
则不是有效的 ip 地址
对于 IPv6,您可以使用:
socket.inet_pton(socket.AF_INET6, some_string)
some_string
同样,如果不是有效地址,它会引发异常。
于 2012-08-06T12:10:45.980 回答
5
仅依赖标准库的 IPv4 + IPv6 解决方案。返回4
or6
或 raise 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)
于 2015-05-14T15:51:12.707 回答
3
你可以使用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")
于 2016-09-25T14:19:11.877 回答
2
于 2013-05-30T20:22:53.443 回答
1
如果您确定该地址是有效的,并且只是试图确定它是 ipv4 还是 ipv6,那么仅仅这样做还不够:
if ":" in address:
print("Ipv6")
else:
print("Ipv4")
于 2016-08-19T12:45:19.743 回答
1
我更喜欢 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
于 2017-11-22T23:09:19.607 回答