Python 2.7查找IP地址并替换为文本

时间:2018-05-13 13:30:03

标签: python python-2.7

我使用Python从路由器中提取路由表并尝试

  1. 删除多余的文字,
  2. 使用文本字符串替换每个路由的目标,以匹配不同的客户分组。
  3. 目前我有::

    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,并替换它们,我也不想发生这种情况。

    我所追求的是完全匹配,只有被发现和替换。

3 个答案:

答案 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')

理想情况下,我希望在所有列表实例中替换字符串元素并保留列表结构吗?

相关问题