我使用arp -a
命令读取LAN上的MAC地址并解析输出。在OS X上,返回一些MAC地址,其中十六进制值缺少前导零。我已经弄清楚如何使用正则表达式插入前导零:
>>> mac = '8:AA:C:3:ED:E'
>>> mac = re.sub('^(?P<hex>.)(?=\:)','0\g<hex>',mac)
>>> mac = re.sub('(?<=\:)(?P<hex>.)(?=\:)','0\g<hex>',mac)
>>> mac = re.sub('(?<=\:)(?P<hex>.)$','0\g<hex>',mac)
>>> print mac
08:AA:0C:03:ED:0E
这样做有效,但我确信有一种方法可以在一行中为任意MAC地址执行替换,其中任何十六进制值都可能缺少前导零...我只能&# 39;弄清楚。
答案 0 :(得分:8)
一种选择不是重新发明轮子并使用netaddr
模块:
>>> from netaddr import EUI
>>> mac = '8:AA:C:3:ED:E'
>>> mac = EUI(mac)
>>> mac
EUI('08-AA-0C-03-ED-0E')
>>> str(mac)
'08-AA-0C-03-ED-0E'
作为奖励,你会得到一个不错的standardized API。
答案 1 :(得分:5)
>>> mac = '8:AA:C:3:ED:E'
>>> print ':'.join([i.zfill(2) for i in mac.split(':')])
08:AA:0C:03:ED:0E
将它用作具有“方便界面”的“标准库”:
>>> def fix_mac_adr(adr):
return ':'.join([i.zfill(2) for i in adr.split(':')])
>>> fix_mac_adr('8:AA:C:3:ED:E')
'08:AA:0C:03:ED:0E'
One-liner(来自Mike DeSimone):
>>> fix_mac_adr = lambda adr: ':'.join([i.zfill(2) for i in adr.split(':')])
答案 2 :(得分:1)
您也可以使用字符串格式进行操作,如下所示:
mac = '8:AA:C:3:ED:E'
>>> print ':'.join('{:0>2}'.format(i) for i in mac.split(':'))
08:AA:0C:03:ED:0E
答案 3 :(得分:0)
mac = '8:AA:C:3:ED:E'
":".join(("0" if len(part)==1 else "")+part for part in mac.split(":"))
输出:
Out[45]: '08:AA:0C:03:ED:0E'