每第 n 个字符拆分字符串并附加 ':'

split string every nth character and append ':'

我已经将一些开关 MAC 地址 table 读取到一个文件中,出于某种原因 MAC 地址如果格式如下:

'aabb.eeff.hhii'

这不是 MAC 地址应该是什么,它应该遵循:'aa:bb:cc:dd:ee:ff'

我在写这篇文章时查看了评分最高的建议,找到了一个可能符合我需要的答案,但它不起作用

satomacoto's answer

MAC 在一个列表中,所以当我 运行 for 循环时,我可以看到它们都是这样的:

当前输出

['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)
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() 在要迭代的两个元素之间添加 :

借鉴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')]

如果你喜欢正则表达式:

import re

dotted = '1234.3456.5678'
re.sub('(..)\.?(?!$)', '\1:', dotted)
# '12:34:34:56:56:78'

模板字符串查找两个任意字符“(..)”并将它们分配到第 1 组。然后允许 0 或 1 个点跟在“\.?”之后并确保在最后没有匹配 '(?!$)'。然后每个匹配项都替换为其第 1 组加一个冒号。

这利用了 re.sub 非重叠 匹配上运行的事实。

您可以使用 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 地址格式

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)