2012-08-06 174 views
8

是否有任何现有的库将字符串解析为ipv4或ipv6地址,或至少确定一个字符串是否是IP地址(任何一种)?检查IP地址

回答

14

是的,有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地址。

+0

AttributeError:'module'对象没有属性'ip_address' – Rory 2012-08-06 12:16:43

+1

@Blazemore:在新版本的模块中使用'IPAddress';修复了我的答案;感谢您的建议! – 2012-08-06 12:20:18

+0

只需添加一点点背景,套接字impl就快得多了。 – marcinkuzminski 2015-03-30 06:05:00

1

ipaddr - Google的IP地址操作包。

请注意,最近已接受了一个将修订版本的软件包包含在Python标准库中的建议(请参阅PEP 3144)。

+0

注意的是,虽然这个库确实已被接受列入标准库,它不包含任何稳定的Python版本呢。(当然,你仍然可以安装PyPI版本。) – 2012-08-06 12:14:16

+0

@Sven Marnach - 好点,已经编辑来反映这一点。 – Ghopper21 2012-08-06 12:17:41

7

对于IPv4可以使用

socket.inet_aton(some_string) 

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

对于IPv6,你可以使用:再次

socket.inet_pton(socket.AF_INET6, some_string) 

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

+0

这只适用于vor不过,IPv4地址。 – 2012-08-06 12:12:32

+0

@Sven,我为v6添加了一种方式,它只是更复杂一点 – 2012-08-06 12:15:50

+0

哦,我不知道这一点。我认为这是最好的解决方案 - 我会删除我的。 – 2012-08-06 12:18:45

1

尝试

apt-get install python-ipaddr 

或得到here

4

的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) 
1

如果你肯定知道该地址是有效的,只是想确定它是否是IPv4或IPv6,是不是足以只是做:

if ":" in address: 
    print("Ipv6") 
else: 
    print("Ipv4") 
+0

我不知道这是一个IP。我需要检查它是否是IP。为了清楚起见,我更新了问题。 – Rory 2016-08-28 11:14:56

2

可以使用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") 
0

我喜欢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