【发布时间】:2015-11-27 16:14:01
【问题描述】:
我有以下任务:
仅使用默认模块确定字符串是否具有有效的 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 的事实,是否有其他模块可以更好地完成相同的任务。
【问题讨论】:
-
不过还不错。
-
一个简单的正则表达式 (regextester.com/22) 不够吗?
-
有效:是否存在该ip地址的节点,或者可以设置该地址的节点。毕竟只分配了允许的 IP 地址的一个子集。
-
如果有效,需要判断是V4还是V6?如果没有,在同一个
try-except子句下同时拥有socket.inet_pton(socket.AF_INET, ip)和socket.inet_pton(socket.AF_INET6, ip)就足够了。如果其中任何一个失败,它就会被抓住。 -
我正在检查“ip”变量中的内容是否包含有效的 IPv6 或 IPv4,不管它是否在使用中。我不能把它们放在同一个尝试下——除非其中一个剂量没有失败,它应该被接受为有效的 IP,但是如果 ip 包含 ipv4,它仍然会失败