是否有现成的库可以将字符串解析为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地址。
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")
我更喜欢使用ip_interface,因为它可以处理带或不带前缀掩码的情况,例如"10.1.1.1/24"和"10.1.1.1"都可以。当然,它适用于IPv4和IPv6。
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
if ":" in address:
print("Ipv6")
else:
print("Ipv4")
IPAddress
;修正了我的回答;感谢您的建议! - Igor Chubinsocket.inet_aton()
只能在 Unix 系统上使用。有关更多详细信息,请参阅 pydoc 文档。 - Paddy