1

我正在建立一个网络认证实验室。有 13 个设备的一些配置,但由于我没有得到与材料完全相同的设备,我必须对配置进行一些更改。

我试图制作一个 Python 脚本,但它与我需要的不完全匹配。

我有一个文件,其中包含要在表单中进行的更改:

find-this,replace-with-this 现在我必须更改的配置主要是 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。

所以它应该完全匹配我想要找到的内容,或者完全匹配我想要找到的内容 + 一个点和一些数字,例如。序列号 0/1.200

任何人都知道如何做到这一点,并能指出我正确的方向吗?

4

2 回答 2

0

一种低效但有效的方法可能是通过代码手动执行 while 循环(如 for 循环),根据您的单词列表检查位置变量前面的字符串,然后替换是否有命中,并添加替换单词的长度到位置变量。有点丑陋但简单有效。

于 2013-09-23T15:43:34.440 回答
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
于 2013-09-23T15:50:22.127 回答