8

是否有任何现有的库可以将字符串解析为 ipv4 或 ipv6 地址,或者至少识别字符串是否是 IP 地址(任何一种)?

4

8 回答 8

17

是的,有一个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将尝试转换(并真正转换)地址,例如10127等等,这些地址看起来不像 IP 地址。

于 2012-08-06T12:09:46.383 回答
9

对于 IPv4,您可以使用

socket.inet_aton(some_string)

如果它抛出异常,some_string则不是有效的 ip 地址

对于 IPv6,您可以使用:

socket.inet_pton(socket.AF_INET6, some_string)

some_string同样,如果不是有效地址,它会引发异常。

于 2012-08-06T12:10:45.980 回答
5

仅依赖标准库的 IPv4 + IPv6 解决方案。返回4or6或 raise 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)
于 2015-05-14T15:51:12.707 回答
3

你可以使用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")
于 2016-09-25T14:19:11.877 回答
2

尝试

apt-get install python-ipaddr

或从 这里获取源代码

于 2013-05-30T20:22:53.443 回答
1

ipaddr -- Google 的 IP 地址操作包。

请注意,最近已经接受了在 Python 标准库中包含该包的修订版本的提议(参见PEP 3144)。

于 2012-08-06T12:09:19.670 回答
1

如果您确定该地址是有效的,并且只是试图确定它是 ipv4 还是 ipv6,那么仅仅这样做还不够:

if ":" in address:
    print("Ipv6")
else:
    print("Ipv4")
于 2016-08-19T12:45:19.743 回答
1

我更喜欢 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
于 2017-11-22T23:09:19.607 回答