在Python中单行执行子字符串替换

时间:2014-05-18 03:20:56

标签: python regex

我使用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;弄清楚。

4 个答案:

答案 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'