【发布时间】:2012-08-03 09:43:29
【问题描述】:
是否有任何现有的库可以将字符串解析为 ipv4 或 ipv6 地址,或者至少识别字符串是否是 IP 地址(任何一种)?
【问题讨论】:
是否有任何现有的库可以将字符串解析为 ipv4 或 ipv6 地址,或者至少识别字符串是否是 IP 地址(任何一种)?
【问题讨论】:
是的,有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 地址。
【讨论】:
IPAddress;修正了我的答案;谢谢你的建议!
对于 IPv4,您可以使用
socket.inet_aton(some_string)
如果抛出异常,some_string 不是有效的 ip 地址
对于 IPv6,您可以使用:
socket.inet_pton(socket.AF_INET6, some_string)
同样,如果some_string 不是有效地址,它会引发异常。
【讨论】:
仅依赖标准库的 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)
【讨论】:
您可以使用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")
【讨论】:
【讨论】:
如果您确定地址是有效的,并且只是试图确定它是 ipv4 还是 ipv6,那么这样做还不够吗:
if ":" in address:
print("Ipv6")
else:
print("Ipv4")
【讨论】:
我更喜欢 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
【讨论】: