检查IP地址

8

是否有现成的库可以将字符串解析为IPv4或IPv6地址,或者至少识别字符串是否是IP地址(任一种类型)?

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地址。


属性错误:'模块'对象没有属性'ip_address'。 - Ivy
1
@Blazemore:在新版本的模块中使用 IPAddress;修正了我的回答;感谢您的建议! - Igor Chubin
只是补充一点背景,套接字实现要快得多。 - marcinkuzminski
不幸的是,socket.inet_aton() 只能在 Unix 系统上使用。有关更多详细信息,请参阅 pydoc 文档 - Paddy
2
请注意,自此发布以来,ipaddr现在已经更名为ipaddress,并成为Python 3库的一部分,同时还有一个Python 2的后移版本:https://docs.python.org/3/library/ipaddress.html - decodebytes
显示剩余2条评论

9
IPv4的话,您可以使用:
socket.inet_aton(some_string)

如果它抛出异常,some_string 就不是一个有效的 IP 地址。

对于 IPv6,您可以使用:

socket.inet_pton(socket.AF_INET6, some_string)

如果some_string不是有效的地址,则会引发异常。

请注意,本文中的“地址”指的是计算机网络中的IP地址或URL地址。

@Sven,我为v6添加了一种方法,只是有点更复杂。 - John La Rooy
1
这些是仅适用于Unix的解决方案。如果您正在寻找跨平台解决方案,它们将无法工作。 - Nigel Small

5

仅依赖于标准库的IPv4 + IPv6解决方案。 返回46,否则会引发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)

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

2

我更喜欢使用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

2

请尝试

apt-get install python-ipaddr

或者从这里获取源代码。


1
如果您确定地址有效且只想确定它是IPv4还是IPv6,那么仅执行以下操作是否足够:
if ":" in address:
    print("Ipv6")
else:
    print("Ipv4")

我不知道它是一个IP地址。我需要检查它是否是一个IP地址。我为了清晰起见更新了问题。 - Ivy

1

ipaddr -- 谷歌的IP地址操作包。

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


请注意,尽管此库确实已被接受并包含在标准库中,但它尚未包含在任何稳定的Python版本中。(当然您仍然可以安装PyPI版本。) - Sven Marnach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接