2012-06-13 60 views
8

我正在尋找更優雅的解決方案來格式化帶有冒號的MAC地址。我正在使用Python 3.2。一個奇特的列表理解也許?Python 3.2中MAC地址的優雅格式

s="" 
h="00233a990c21" 
for i in range(0,12,2): 
    s += h[i:i+2] + ":" 
s=s[:-1] 
print("s=",s) 
+0

http://stackoverflow.com/questions/4959741/python-print-mac-address-out-of-6-byte-string –

+0

@EricFortis,這個例子是不同的,其中MAC地址是一個二進制字符串。這個問題有ascii字符串作爲起點 – TJD

+0

@Eric:略有不同,我看到這個問題和答案,但它沒有回答這個具體的問題 – jftuga

回答

12

您的代碼很容易轉化爲理解的形式:

':'.join(h[i:i+2] for i in range(0,12,2)) 
+2

+1我喜歡它比我的解決方案更好:) – Levon

1

不知道如何漂亮,這是,但它會做什麼你問:

':'.join([h[i:i+2] for i,j in enumerate(h) if not (i%2)]) 

給出:

'00:23:3a:99:0c:21' 
+1

爲什麼你使用枚舉? –

+1

這是我使用的。它*確實*做OP所要求的,所以是*有效*答案。 – Levon

0

這裏最簡單的辦法是隻使用str.join()

>>> ":".join(str_grouper(2, "00233a990c21")) 
'00:23:3a:99:0c:21' 

這裏使用grouper()配方的修改版本從itertools文檔:

def str_grouper(n, iterable): 
    args = [iter(iterable)] * n 
    for part in zip(*args): #itertools.izip in 2.x for efficiency. 
     yield "".join(part) 
0

嗯,我可能會用很具體的事情做起,因爲你知道它是一個MAC地址,你知道確切的大小和格式。

print "%s:%s:%s:%s:%s:%s" % (h[0:2], h[2:4], h[4:6], h[6:8], h[8:10], h[10:12]) 

但是,如果我們創建一個類,然後告訴它如何格式化它的字符串,我們可以做得更好。

class Mac(): 
    def __init__(self, mac): 
     self.mac = mac 
    def __str__(self): 
     return "%s:%s:%s:%s:%s:%s" % (
      self.mac[0:2], 
      self.mac[2:4], 
      self.mac[4:6], 
      self.mac[6:8], 
      self.mac[8:10], 
      self.mac[10:12]) 

m = Mac("123456789012") 
print m 
+2

這有點冗長,而且新樣式字符串格式化(''str.format()''over'%')優先於新代碼。 –

0
>>> import itertools 
>>> h = '00233a990c21' 
>>> ':'.join(a+b for a, b in (itertools.izip(
...        itertools.compress(h, itertools.cycle((1,0))), 
...        itertools.compress(h, itertools.cycle((0,1)))))) 
>>> '00:23:3a:99:0c:21' 

這是否取勝,爲括號密度最高?

+1

是的,你贏了! – jamylak

1

這不是最短的解決方案,但它接受所有常見類型的mac格式作爲輸入。它也做了一些驗證檢查。

import re 

def format_mac(mac: str) -> str: 
    mac = re.sub('[.:-]', '', mac).lower() # remove delimiters and convert to lower case 
    mac = ''.join(mac.split()) # remove whitespaces 
    assert len(mac) == 12 # length should be now exactly 12 (eg. 008041aefd7e) 
    assert mac.isalnum() # should only contain letters and numbers 
    # convert mac in canonical form (eg. 00:80:41:ae:fd:7e) 
    mac = ":".join(["%s" % (mac[i:i+2]) for i in range(0, 12, 2)]) 
    return mac 

這裏是MAC地址字符串列表以及它們是否會被視爲有效或無效:

'008041aefd7e', # valid 
'00:80:41:ae:fd:7e', # valid 
'00:80:41:AE:FD:7E', # valid 
'00:80:41:aE:Fd:7E', # valid 
'00-80-41-ae-fd-7e', # valid 
'0080.41ae.fd7e', # valid 
'00 : 80 : 41 : ae : fd : 7e', # valid 
' 00:80:41:ae:fd:7e ', # valid 
'00:80:41:ae:fd:7e\n\t', # valid 

'aa:00:80:41:ae:fd:7e', # invalid 
'0:80:41:ae:fd:7e', # invalid 
'ae:fd:7e', # invalid 
'$$:80:41:ae:fd:7e', # invalid 

所有有效的將在規範形式返回:

'00:80:41:ae:fd:7e'