Шаг 85.
Однострочники Python. Регулярные выражения. Модификация задаваемых регулярными выражениями шаблонов в многострочном строковом значении

    На этом шаге мы рассмотрим использование метода sub().

    В последнем однострочнике вы научитесь модифицировать текст, а не только находить его части, соответствующие регулярному выражению.

Общее описание

    Для замены всех вхождений конкретного шаблона регулярное_выражение новой строкой символов замена в заданном тексте служит функция re.sub(регулярное_выражение, замена, текст). С ее помощью можно быстро редактировать большие массивы текста, обходясь без выполнения ручной работы.

    В предыдущих шагах вы научились находить соответствие в тексте шаблонам регулярных выражений. Но что, если определенный шаблон нужно считать найденным только в том случае, если не встречается какой-то другой шаблон? Задаваемый регулярным выражением A(?!X) шаблон негативного опережающего просмотра (negative lookahead) считается соответствующим регулярному выражению A, только если далее не найдено регулярное выражение X. Например, регулярному выражению (?!good) удовлетворяет строка 'this is not great', но не строка 'this is not good'.

Код

    Наши данные представляют собой строковое значение, и задача - заменить вхождения Alice Wonderland на Alice Doe, не заменяя при этом вхождений 'Alice Wonderland' (заключенных в одинарные кавычки) (пример 5.10).


Пример 5.10. Однострочное решение для замены комбинаций символов в тексте
## Зависимости
import re

## Данные
text = '''
Alice Wonderland married John Doe.
The new name of former 'Alice Wonderland' is Alice Doe.
Alice Wonderland replaces her old name 'Wonderland' with her new name 'Doe'.
Alice's sister Jane Wonderland still keeps her old name.
'''

## Однострочник
updated_text = re.sub("Alice Wonderland(?!')", 'Alice Doe', text)

## Результат
print(updated_text)
Архив с файлом можно взять здесь.

    Этот код выводит модифицированный текст. Какой?

Принцип работы

    Мы заменяем все вхождения Alice Wonderland на Alice Doe, кроме тех, которые заканчиваются одинарной кавычкой '. Для этого мы воспользовались негативным опережающим просмотром. Обратите внимание, что мы проверяем только наличие закрывающей кавычки. Например, нашему регулярному выражению удовлетворяет строковое значение с открывающей кавычкой, но без закрывающей, так что мы просто заменим его. В общем случае это может быть нежелательно, но в нашем конкретном примере строкового значения приводит к желаемому поведению:

## Результат 
print(updated_text)

# Alice Doe married John Doe.
# The new name of former 'Alice Wonderland' is Alice Doe.
# Alice Doe replaces her old name 'Wonderland' with her new name 'Doe'.
# Alice's sister Jane Wonderland still keeps her old name.

    Как видите, исходное имя 'Alice Wonderland' не меняется, когда заключено в одинарные кавычки, - что нам и нужно было.

    На следующем шаге мы подведем некоторые итоги.




Предыдущий шаг Содержание Следующий шаг