Python:用文件中的多个字符串替换多个字符串

2024-07-05 15:02:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我试过做一个Python脚本,但它与我需要的不完全匹配。在

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

找到这个,换成这个 现在我要更改的配置主要是在面内,所以它看起来像这样(我删除了一些配置以使其更小):

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
!

我想替换的地方

^{pr2}$

或者像这样:

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。 我尝试过使用boundry(\b)和^和$,但似乎不起作用;还有一种情况是,Serial1可以,但Serial1/0不可以,但Serial1.200可以。在

所以它应该完全匹配我想找到的,或者我想找到的,加上一个点和一些数字,比如Serial0/1.200

有人知道怎么做,能给我指出正确的方向吗?在


Tags: totext地方descriptionrouterelayframeinterface
2条回答

一种效率低下但有效的方法可能是手动执行while循环(比如在代码中执行for循环),根据单词列表检查position变量前面的字符串,然后在命中时进行替换,并将替换单词的长度添加到position变量中。有点难看但简单有效。在

您可以逐行处理并打破循环:

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

^{pr2}$

相关问题 更多 >