2013-03-28 31 views
1

我正在編寫一個Python腳本,它將採用CIDR格式的IP地址(即1.1.1.0/32或10.0.0.1/24)並將IP分成三部分:前三個八比特組(1.1.1),最後一個八位字節(0)和子網掩碼(32)。 IP的長度是可變的,所以我不知道我是否可以使用某種字符串字符計數器。使用Python獲取IP地址中的最後一個字節使用Python獲取IP地址的最後一個八位字節

任何想法?

感謝

+0

IPv6怎麼樣? – plaes

+2

Python 3.3有一個['ipaddress'模塊](http://docs.python.org/3/library/ipaddress.html),可以很好地處理CIDR格式的遮罩。有一個[port](https://pypi.python.org/pypi/ipaddress)可用於Python 2.6/2.7。 –

+0

如果你使用的是子網掩碼,你爲什麼關心八位字節的邊界?你不是真的想要:網絡號碼,主機號碼和子網掩碼嗎? –

回答

3

解析IP爲一個int,並使用位運算符來得到它。

另一種方法是使用像ipaddr-py這樣的庫。我個人比較喜歡圖書館。

0

我會使用正則表達式。您可以使用r'將所有八位字節分割成一個列表。然後按照您喜歡的順序重新組合它們。你可以寫一個更復雜的重做一次,但我認爲這會更困難。

import re 
ip = '1.1.1.1/32' 
re.split(r'(\.|/)', ip) 
2

使用正則表達式:

#!/usr/bin/python 
import re 


def extractIP(ipStr): 

    l = re.split('(.*)\.(.*)\.(.*)\.(.*)/(.*)', ipStr) 
    return l[1:-1] 

print extractIP("1.2.3.45/35") 
0

使用正則表達式將是在這種情況下簡單。

(\d{,3}\.\d{,3}\.\d{,3})\.(\d{,3})\/(\d+) 

聯合使用re.match方法會產生您的結果。

2

正則表達式可能非常麻煩。你也可以使用split()函數

inp = '192.168.0.1/24' 
ip, submask = inp.split('/') 
octets = ip.split('.')