我正在寻找一种更优雅的解决方案来使用冒号格式化MAC地址。我使用的是Python 3.2。也许是一种奇特的清单理解?
s=""
h="00233a990c21"
for i in range(0,12,2):
s += h[i:i+2] + ":"
s=s[:-1]
print("s=",s)
答案 0 :(得分:13)
您的代码很容易转换为理解形式:
':'.join(h[i:i+2] for i in range(0,12,2))
答案 1 :(得分:2)
from netaddr import EUI, mac_unix_expanded
print(EUI('00:01:02:03:04:05', dialect=mac_unix_expanded))
print(EUI('1-2-3-4-5-6', dialect=mac_unix_expanded))
答案 2 :(得分:1)
不确定这是多么漂亮,但它会按照你的要求行事:
':'.join([h[i:i+2] for i,j in enumerate(h) if not (i%2)])
给出:
'00:23:3a:99:0c:21'
答案 3 :(得分: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'
答案 4 :(得分:1)
我认为这不是新手,但仍然最优雅:
import re
':'.join(re.findall('..', '08002714f616'))
答案 5 :(得分: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)
答案 6 :(得分: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
答案 7 :(得分: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'
这是否会赢得最高密度的括号?