Серия руководств по регулярным выражениям с использованием Python
Если вы наткнулись на эту статью и не знакомы с этой серией руководств по регулярным выражениям, не стесняйтесь взглянуть на оставшуюся часть серии (по порядку):
- Регулярные выражения: основы
- Регулярные выражения: группировка и символ вертикальной черты
- Регулярные выражения: повторение и жадное/нежадное сопоставление
- Регулярные выражения: классы символов и метод findall()
- Регулярные выражения: точка-звезда и символы вставки/доллара
- Регулярные выражения: метод sub() и подробный режим
Замена строк методом Sub()
Регулярные выражения могут не только находить текстовые шаблоны, но и заменять их новым текстом. Методу sub() для объектов регулярных выражений передаются два аргумента. Первый аргумент — это строка для замены любых совпадений. Второй аргумент — это строка для регулярного выражения. Метод sub() возвращает строку с примененными заменами.
Давайте посмотрим на следующий пример:
Пример 1. Использование метода sub()
Мы видим, что пытаемся найти все вхождения слов, которые следуют за словом "Агент". Мы использовали метод findall(), и он вернул «Агент Зохаиб» и «Агент Боб».
Теперь, возможно, мы хотим отредактировать некоторые слова из строки.
namesRegex.sub(‘REDACTED’, ‘Agent Zohaib gave the secret documents to Agent Bob.’) # ‘REDACTED gave the secret documents to REDACTED.’
Слово «ОТРЕДАКТИРОВАНО» было заменено на каждую строку, которая соответствовала шаблону регулярного выражения в строке.
Пример 2. Использование групп при реализации метода sub()
Иногда вам может понадобиться использовать сам совпадающий текст как часть замены. В качестве первого аргумента для sub() вы можете ввести \1, \2, \ 3 и т. д., что означает "Введите текст группы 1, 2, 3 и т. д. в качестве замены".
Например, предположим, что вы хотите подвергнуть цензуре имена секретных агентов, показывая только первые буквы их имен. Для этого вы можете использовать регулярное выражение Agent (\w)\w* и передать r'\1****' в качестве первого аргумента sub(). \1 в этой строке будет заменен любым текстом, совпавшим с группой 1, то есть группой (\w) регулярное выражение.
Управление сложными регулярными выражениями в режиме VERBOSE
Регулярные выражения хороши, если текстовый шаблон, который вам нужно сопоставить, прост. Но для сопоставления сложных текстовых шаблонов могут потребоваться длинные запутанные регулярные выражения. Это можно смягчить, указав функции re.compile() игнорировать пробелы и комментарии внутри строки регулярного выражения. Этот подробный режим можно включить, передав переменнуюre.VERBOSEв качестве второго аргумента в re.compile().
Пример 3. Реализация режима VERBOSE
Взгляните на следующее:
phoneRegex = re.compile(r’((\d{3}|\(\d{3}\))?(\s|-|\.)?\d{3}(\s|-|\.)\d{4}(\s*(ext|x|ext.)\s*\d{2,5})?)’)
Этот взгляд действительно грязный, и его трудно читать.
На самом деле мы можем использовать режим VERBOSE и распределить регулярное выражение по нескольким строкам с такими комментариями:
Теперь это выглядит намного чище и легче для чтения.
Обратите внимание, что в этом примере используется синтаксис с тройными кавычками (r’’’) вместо обычной необработанной строки с одинарными кавычками (r’). Мы используем синтаксис с тройными кавычками, чтобы мы могли распределить регулярное выражение по многим строкам, сделав его более разборчивым.
Правила комментариев внутри строки регулярного выражения такие же, как и в обычном коде Python: символ # и все, что следует за ним, игнорируются. Более того, лишние пробелы внутри многострочной строки для регулярного выражения не считаются частью текстового шаблона, который необходимо сопоставить. В целом, это помогает организовать ваше регулярное выражение.
Эта статья завершает серию руководств по регулярным выражениям. Я действительно надеюсь, что оказал услугу, опубликовав эту серию, и что вы узнали что-то из этого.
Следите за будущими уроками и хлопайте этой статье, если она вам понравилась!