我正在建立一个网络认证实验室。 有13种设备有一些配置,但由于我没有使用与制作材料完全相同的设备,我必须对配置进行一些更改。
我尝试制作一个Python脚本,但它与我需要的完全不符。
我有一个文件,其中包含以下表单中所做的更改:
查找-此,代替与 - 此 现在我必须更改的配置主要是intarfaces,所以它看起来像这样(我删除了一些配置tom使它变小):
interface Serial0
description Connected to R1
frame-relay route 102 interface Serial1 201
frame-relay route 103 interface Serial2 301
frame-relay route 104 interface Serial4 401
frame-relay route 105 interface Serial5 501
frame-relay route 113 interface Serial3 311
!
interface Serial1
description Connected to R2
frame-relay route 201 interface Serial0 102
frame-relay route 203 interface Serial2 302
frame-relay route 204 interface Serial4 402
frame-relay route 205 interface Serial5 502
frame-relay route 213 interface Serial3 312
!
我要替换的地方
Serial0,Serial1/0
Serial1,Serial1/1
Serial2,Serial1/2
Serial3,Serial1/3
Serial4,Serial1/4
或者像这样:
interface Serial0/0
!
interface Serial0/0.1 point-to-point
!
interface Serial0/1
!
我要替换的地方
Serial0/0,Serial0/2/0
Serial0/1,Serial0/1/0
现在我用这种方法逐行完成:
def replace_all(text, dic):
for i, j in dic.iteritems():
text = re.sub("\\b"+i+"\\b", j, text)
我的问题是Serial0或Serial0 / 0第一次匹配并更改为Serial1 / 0,但然后由Serial1匹配,所以我得到Serial1 / 1/0。 我尝试过两个边界(\ b)和^和$,但它似乎不起作用;我也有这样的情况:它的串口为Serial1而不是Serial1 / 0,但它与Serial1.200有关。
所以它应该完全匹配我想要找到的,或者我想要找到的东西+一个点和一些数字,例如。的Serial0 / 1.200
任何人都知道如何做到这一点,并能指出我正确的方向吗?
答案 0 :(得分:0)
一种低效但有效的方法可能是手动执行while循环,如for循环代码,检查位置变量前面的字符串对着你的单词列表然后替换,如果有一个命中,并添加长度替换字到位置变量。有点丑陋但又简单有效。
答案 1 :(得分:0)
您可以逐行处理并打破循环:
new_text=""
for line in lines:
new_text= new_text + fix_line(line)
def fix_line(line):
for i, j in dic.iteritems():
new_line = re.sub("\\b"+i+"\\b", j, line)
if new_line != line: #line changed stop loop
return new_line
return line #line didn't match
print(new_text)
修改:如果你想在正则表达式上进行完全匹配,你应该使用split
str_list = line.split(" ")
if len(str_list) > 4: #case the line has interface
process(str_list[4])
def process(str_to_match):
if str_to_match in dic:
return dic[str_to_match] #will get the exact match saved in the dict
return str_to_match #not in dict dont replace