Регулярное выражение Python заменяет все шаблоны, кроме случаев, когда оно находится рядом с повторяющимся шаблоном. - PullRequest
3 голосов
/ 08 июля 2019

Я использую Python, и у меня есть многострочная строка, которая выглядит следующим образом:

The quick brown fox jumps over the lazy dog. 
The quick quick brown fox jumps over the quick lazy dog. This a very very very very long line.
This line has other text?
The quick quick brown fox jumps over the quick lazy dog.

Я хотел бы заменить все вхождения quick на slow, но с одним исключением. Когда quick обрабатывается quick, тогда только первое quick преобразуется вторым, соседние quick остаются без изменений.

Итак, вывод должен выглядеть следующим образом:

The slow brown fox jumps over the lazy dog. 
The slow quick brown fox jumps over the slow lazy dog. This a very very very very long line.
This line has other text?
The slow quick brown fox jumps over the slow lazy dog.

Я могу сделать это, используя несколько проходов, где я сначала конвертирую все в slow, а затем преобразую регистр края во время моего второго прохода. Но я надеюсь, что есть более элегантное или очевидное однопроходное решение.

Ответы [ 3 ]

2 голосов
/ 08 июля 2019

Вот вариант для двигателей регулярных выражений, которые не поддерживают прогнозирование:

quick(( quick)*)

заменено на

slow\1
2 голосов
/ 08 июля 2019

Вот один из способов использования re.sub с использованием отрицательного внешнего вида для замены quick, если ему не предшествует одна и та же подстрока:

import re
re.sub(r'(?<!quick\s)quick', 'slow', s)

Использование общих примеров:

s1 = 'The quick brown fox jumps over the lazy dog. '
s2 = 'The quick quick brown fox jumps over the quick lazy dog. This a very very very very long line.'

re.sub(r'(?<!quick\s)quick', 'slow', s1)
# 'The slow brown fox jumps over the lazy dog. '

re.sub(r'(?<!quick\s)quick', 'slow', s2)
# 'The slow quick brown fox jumps over the slow lazy dog. This a very very very very long line.'

Распределение регулярных выражений:

  • (?<!quick\s)quick

    • Отрицательный взгляд назад (?<!quick\s)

      • quick соответствует буквально быстрым буквам (с учетом регистра)

      • \s соответствует любому пробелу (равен [\r\n\t\f\v ])

    • быстрое совпадение букв буквально (с учетом регистра)

1 голос
/ 08 июля 2019

Вы можете использовать группировку для этой задачи следующим образом:

import re
txt1 = 'The quick brown fox jumps over the lazy dog.'
txt2 = 'The quick quick brown fox jumps over the quick lazy dog.'
out1 = re.sub(r'(quick)((\squick)*)',r'lazy\2',txt1)
out2 = re.sub(r'(quick)((\squick)*)',r'lazy\2',txt2)
print(out1) # The lazy brown fox jumps over the lazy dog.
print(out2) # The lazy quick brown fox jumps over the lazy lazy dog.

Идея довольно проста: 1-я группа для первой quick и 2-я группа для остальных трюков.Затем замените его на lazy и содержимое 2-й группы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...