我使用Python从路由器中提取路由表并尝试
目前我有::
infile = "routes.txt"
outfile = "output.txt"
delete_text = ["ROUTER1# sh run | i route", "ip route"]
client_list = ["CUST_A","CUST_B"]
subnet_list = ["1.2.3.4","5.6.7.8"]
fin = open(infile)
fout = open(outfile, "w+")
for line in fin:
for word in delete_text:
line = line.replace(word, "")
for word in subnet_list:
line = line.replace("1.2.3.4", "CUST_A")
for word in subnet_list:
line = line.replace("5.6.7.8", "CUST_B")
fout.write(line)
fin.close()
fout.close()
f = open('output.txt', 'r')
file_contents = f.read()
print (file_contents)
f.close()
这在一定程度上起作用,但是当它搜索和替换例如5.6.7.8
它还会在其他IP地址中获取该字符串,例如5.6.7.88
,并替换它们,我也不想发生这种情况。
我所追求的是完全匹配,只有被发现和替换。
答案 0 :(得分:0)
您可以将re.sub()
与明确的字边界(\b
)一起使用:
>>> re.sub(r'\b5.6.7.8\b', 'CUST_B', 'test 5.6.7.8 test 5.6.7.88 test')
'test CUST_B test 5.6.7.88 test'
答案 1 :(得分:0)
正如您所发现的那样,您的方法很糟糕,因为它会导致误报(即不良匹配)。您应该将行解析为标记,然后匹配各个标记。这可能就像第一次在空格上分割tokens = line.split()
一样简单。但是,如果该行包含带引号的字符串,则可能无效。考虑一下这句话的结果:"ab 'cd ef' gh".split()
。所以你可能需要一个更复杂的解析器。
您可以使用re
模块使用\b
元序列执行替换,以确保匹配开始和结束于"字"边界。但这有其独特的失败模式。例如,请考虑.
(句点)字符与任何字符匹配。因此,建议{@ 1}} @NPE建议实际上不仅会匹配文字词re.sub('\b5.6.7.8\b', ...)
,还会匹配5.6.7.8
。考虑到您期望的输入,这可能不是一个问题,但是大多数人都不会考虑,因此是另一个错误来源。正则表达式很少是像这样的问题的正确工具。
答案 2 :(得分:0)
谢谢大家,我一直在测试这个,并且re.sub函数似乎在循环中打印出下面的字符串:CUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTB。
我已将上面的代码段修改为:
对于subnet_list中的单词:
line = re.sub(r' \ b5.6.7.8 \ b',' CUST_B',' 5.6.7.88')
理想情况下,我希望在所有列表实例中替换字符串元素并保留列表结构吗?