我已将某些交换机MAC地址表读入文件,并且出于某种原因,如果格式化为MAC地址,则将其写入:
' aabb.eeff.hhii'
这不是MAC地址应该是什么,它应该遵循:' aa:bb:cc:dd:ee:ff'
我在撰写本文时已经看过评分最高的建议,并找到了一个可能符合我需求但却无法运作的答案
MAC在一个列表中,所以当我运行循环时,我可以看到它们全部:
当前输出
['8424.aa21.4er9','fa2']
['94f1.3002.c43a','fa1']
我只想追加':'在第2个第n个角色,我可以删除'。'通过简单的替换,所以不要担心
所需的输出
['84:24:aa:21:4e:r9','fa2']
['94:f1:30:02:c4:3a','fa1']
我的代码
info = []
newinfo = []
file = open('switchoutput')
newfile = file.read().split('switch')
macaddtable = newfile[3].split('\\r')
for x in macaddtable:
if '\\n' in x:
x = x.replace('\\n', '')
if carriage in x:
x = x.replace(carriage, '')
if '_#' in x:
x = x.replace('_#', '')
x.split('/r')
info.append(x)
for x in info:
if "Dynamic" in x:
x = x.replace('Dynamic', '')
if 'SVL' in x:
x = x.replace('SVL', '')
newinfo.append(x.split(' '))
for x in newinfo:
for x in x[:1]:
if '.' in x:
x = x.replace('.', '')
print(x)
答案 0 :(得分:2)
借用you linked的解决方案,您可以按如下方式实现:
macs = [['8424.aa21.4er9','fa2'], ['94f1.3002.c43a','fa1']]
macs_fixed = [(":".join(map(''.join, zip(*[iter(m[0].replace(".", ""))]*2))), m[1]) for m in macs]
哪个收益率:
[('84:24:aa:21:4e:r9', 'fa2'), ('94:f1:30:02:c4:3a', 'fa1')]
答案 1 :(得分:2)
如果你喜欢正则表达式:
re.sub
模板字符串查找两个任意字符'(..)'并将它们分配给组1.然后允许0或1个点跟随'\。?'并确保在最后没有匹配'(?!$)'。然后将每个匹配替换为其组1加冒号。
这使用{{1}}对非重叠匹配进行操作的事实。
答案 2 :(得分:1)
x = '8424.aa21.4er9'.replace('.','')
print(':'.join(x[y:y+2] for y in range(0, len(x) - 1, 2)))
>> 84:24:aa:21:4e:r9
一旦你清理完字符串就迭代它,每次循环字符串时抓住2个字符串。使用range()
第三个可选参数,您可以遍历每个第二个元素。使用join()
在您正在迭代的两个元素之间添加:
。
答案 3 :(得分:1)
您可以使用re
模块来实现所需的输出。
import re
s = '8424.aa21.4er9'
s = s.replace('.','')
groups = re.findall(r'([a-zA-Z0-9]{2})', s)
mac = ":".join(groups)
#'84:24:aa:21:4e:r9'
正则表达式解释
[a-zA-Z0-9]
:匹配任何字母或数字{2}
:最多匹配2个字符。通过这种方式,您可以获得两个人的组,然后在:
加入他们以获得所需的mac地址格式
答案 4 :(得分:0)
wrong_mac = '8424.aa21.4er9'
correct_mac = ''.join(wrong_mac.split('.'))
correct_mac = ':'.join(correct_mac[i:i+2] for i in range(0, len(correct_mac), 2))
print(correct_mac)