【问题标题】:Any better way to check string for valid IPv4 and IPv6?检查字符串是否有有效的 IPv4 和 IPv6 有更好的方法吗?
【发布时间】: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,它仍然会失败

标签: python ipv6 ipv4


【解决方案1】:

您可以使用 ipaddress 模块。文档可以在这里找到:https://docs.python.org/3/library/ipaddress.html

示例代码:

>>> 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

【讨论】:

  • 我猜不是在 Python 2.x 中?
  • 它实际上已经被向后移植到 2.6
  • 这很好,除非它不是默认模块的一部分。我必须使用 python2
  • @KacperReutt 我没有找到标准 2.x 模块的链接?即使是这样,包括一个测试用例也会很有帮助。
  • 还有一个 IPy 模块,但默认情况下不可用
猜你喜欢
  • 1970-01-01
  • 2014-12-19
  • 2013-02-13
  • 2012-09-03
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多