2012-08-06 177 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