每第 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)
我已经将一些开关 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)