Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有更好的方法来检查有效IPv4和IPv6的字符串?_Python_Ipv6_Ipv4 - Fatal编程技术网

Python 有没有更好的方法来检查有效IPv4和IPv6的字符串?

Python 有没有更好的方法来检查有效IPv4和IPv6的字符串?,python,ipv6,ipv4,Python,Ipv6,Ipv4,我有以下任务: 仅使用默认模块标识字符串是否具有有效的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_

我有以下任务:

仅使用默认模块标识字符串是否具有有效的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,是否有其他模块可以以更好的方式完成相同的任务。

您可以使用ipaddress模块。文档可在此处找到:

示例代码:

>>> ipaddress.ip_address('192.168.0.1')
IPv4Address('192.168.0.1')
>>> ipaddress.ip_address('2001:db8::')
IPv6Address('2001:db8::')
>>> ipaddress.ip_address('323.4.7.8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.4/ipaddress.py", line 54, in ip_address
    address)
ValueError: '323.4.7.8' does not appear to be an IPv4 or IPv6 address
>>> ipaddress.ip_address('ffff::4543:1f1f::134')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.4/ipaddress.py", line 54, in ip_address
    address)
ValueError: 'ffff::4543:1f1f::134' does not appear to be an IPv4 or IPv6 address
>ipaddress.ip\u地址('192.168.0.1')
IPV4地址('192.168.0.1')
>>>ipaddress.ip_地址('2001:db8::'))
IPV6地址('2001:db8::')
>>>ipaddress.ip_地址('323.4.7.8')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ip_地址中的文件“/usr/lib/python3.4/ipaddress.py”,第54行
(地址)
ValueError:“323.4.7.8”似乎不是IPv4或IPv6地址
>>>ipaddress.ip_地址('ffff::4543:1f1f::134')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ip_地址中的文件“/usr/lib/python3.4/ipaddress.py”,第54行
(地址)
ValueError:“ffff::4543:1f1f::134”似乎不是IPv4或IPv6地址

这还不错。一个简单的regex()就足够了吗?使用valid:您的意思是存在一个具有该ip地址的节点,还是可以设置一个具有该地址的节点。毕竟,只分配了允许的ip地址的一个子集。如果它有效,您需要告诉它是V4还是V6吗?如果没有,则在同一
子句下同时使用
socket.inet\u pton(socket.AF\u inet,ip)
socket.inet\u pton(socket.AF\u INET6,ip)
。我正在检查“ip”变量中的内容是否包含有效的IPv6或IPv4,不管它是否正在使用。我不能把它们放在相同的尝试下,除非如果其中一个没有失败,它应该被接受为一个有效的IP,但是根据您的建议,如果IP包含ipv4,它仍然会失败,我猜它不会在Python 2.x中出现?它实际上已经被后端口到2.6,这将是很好的,除非它不是默认模块的一部分。我必须使用python2@KacperReutt我找不到标准2.x模块的链接?即使是这样,包含一个测试用例也会很有帮助。还有一个IPy模块,但默认情况下不可用