我正在尋找更優雅的解決方案來格式化帶有冒號的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)
我正在尋找更優雅的解決方案來格式化帶有冒號的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)
不知道如何漂亮,這是,但它會做什麼你問:
':'.join([h[i:i+2] for i,j in enumerate(h) if not (i%2)])
給出:
'00:23:3a:99:0c:21'
爲什麼你使用枚舉? –
這是我使用的。它*確實*做OP所要求的,所以是*有效*答案。 – Levon
這裏最簡單的辦法是隻使用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)
嗯,我可能會用很具體的事情做起,因爲你知道它是一個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
這有點冗長,而且新樣式字符串格式化(''str.format()''over'%')優先於新代碼。 –
>>> 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'
這是否取勝,爲括號密度最高?
是的,你贏了! – jamylak
這不是最短的解決方案,但它接受所有常見類型的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'
http://stackoverflow.com/questions/4959741/python-print-mac-address-out-of-6-byte-string –
@EricFortis,這個例子是不同的,其中MAC地址是一個二進制字符串。這個問題有ascii字符串作爲起點 – TJD
@Eric:略有不同,我看到這個問題和答案,但它沒有回答這個具體的問題 – jftuga