Python 2.7 найти IP-адрес и заменить текст - PullRequest
0 голосов
/ 13 мая 2018

Я использовал Python для извлечения таблицы маршрутов из маршрутизатора и пытаюсь

  1. убрать лишний текст, а
  2. заменить пункт назначения каждого маршрута текстовой строкойдля сопоставления с другой группой клиентов.

На данный момент у меня есть ::

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 голосов
/ 14 мая 2018

Как вы узнали, ваш подход плох, потому что он приводит к ложным срабатываниям (т. Е. Нежелательным совпадениям).Вы должны разобрать строки в токены, а затем сопоставить отдельные токены.Это может быть так же просто, как сначала выполнить tokens = line.split(), чтобы разбить пробел.Это, однако, может не сработать, если строка содержит строки в кавычках.Рассмотрим, к чему приводит это утверждение: "ab 'cd ef' gh".split().Поэтому вам может потребоваться более сложный синтаксический анализатор.

Вы можете использовать модуль re для выполнения подстановок, используя метапоследовательность \b, чтобы гарантировать, что совпадения начинаются и заканчиваются на границе слова.Но у этого есть свои, уникальные, способы отказа.Например, предположим, что символ . (точка) соответствует любому символу.Таким образом, выполнение re.sub('\b5.6.7.8\b', ...), как предложено @NPE, на самом деле будет соответствовать не только буквальному слову 5.6.7.8, но и 5x6.7y8.Это может не беспокоить, учитывая ожидаемые вами данные, но это то, что большинство людей не учитывают, и поэтому является еще одним источником ошибок.Регулярные выражения редко являются подходящим инструментом для решения проблемы, подобной этой.

0 голосов
/ 14 мая 2018

спасибо, ребята, я проверял это, и функция re.sub, кажется, просто выводит в цикле строку ниже: CUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUSTBCUST *USTUSTUSTline = re.sub (r '\ b5.6.7.8 \ b', 'CUST_B', '5.6.7.88')

В идеале я хотел бы заменить строковый элемент во всех вхождениях списканаряду с сохранением структуры списка?

0 голосов
/ 13 мая 2018

Вы можете использовать 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...