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