Рассмотренных стандартных возможностей для работы с текстом достаточно далеко не всегда. Например, в методах find()
и replace()
задается всего одна строка. В реальных задачах такая однозначность встречается довольно редко, чаще требуется найти или заменить строки, отвечающие некоторому шаблону.
Регулярные выражения (regular expressions) описывают множество строк, используя специальный язык, который сейчас и будет рассмотрен. (Строка, в которой задано регулярное выражение, будет называться шаблоном.)
Для работы с регулярными выражениями в Python используется модуль re
. В следующем примере регулярное выражение помогает выделить из текста все числа:
>>> import re
>>> pattern = r"[0–9]+"
>>> number_re = re.compile(pattern)
>>> number_re.findall("122 234 65435")
['122', '234', '65435']
В этом примере шаблон pattern описывает множество строк, которые состоят из одного или более символов из набора «0
», «1
» , …, «9
» . Функция re.compile()
компилирует шаблон в специальный Regex–объект, который имеет несколько методов, в том числе метод findall()
для получения списка всех непересекающихся вхождений строк, удовлетворяющих шаблону, в заданную строку.
То же самое можно было сделать и так:
>>> import re
>>> re.findall(r"[0–9]+", "122 234 65435")
['122', '234', '65435']
Предварительная компиляция шаблона предпочтительнее при его частом использовании, особенно внутри цикла.
Следует заметить, что для задания шаблона использована необработанная строка. В данном примере она не требовалась, но в общем случае лучше записывать строковые литералы именно так, чтобы исключить влияние специальных последовательностей, записываемых через обратную косую черту.
Синтаксис регулярного выражения
Синтаксис регулярных выражений в Python почти такой же, как в Perl, grep и некоторых других инструментах. Часть символов (в основном буквы и цифры) обозначают сами себя. Строка удовлетворяет (соответствует) шаблону, если она входит во множество строк, которые этот шаблон описывает.
Здесь стоит также отметить, что различные операции используют шаблон по–разному. Так, search()
ищет первое вхождение строки, удовлетворяющей шаблону, в заданной строке, а match()
требует, чтобы строка удовлетворяла шаблону с самого начала.
Символы, имеющие специальное значение в записи регулярных выражений:
Символ | Что обозначает в регулярном выражении |
---|---|
"." | Любой символ |
"^" | Начало строки |
"$" | Конец строки |
"*" | Повторение фрагмента нуль или более раз (жадное) |
"+" | Повторение фрагмента один или более раз (жадное) |
"?" | Предыдущий фрагмент либо присутствует, либо отсутствует |
"{m,n}" | Повторение предыдущего фрагмента от m до n раз включительно (жадное) |
"[...]" | Любой символ из набора в скобках. Можно задавать диапазоны символов с идущими подряд кодами, например: a–z |
"[^...]" | Любой символ не из набора в скобках |
"\" | Обратная косая черта отменяет специальное значение следующего за ней символа |
"|" | Фрагмент справа или фрагмент слева |
"*?" | Повторение фрагмента нуль или более раз (не жадное) |
"+?" | Повторение фрагмента один или более раз (не жадное) |
"{m,n}?" | Повторение предыдущего фрагмента от m до n раз включительно (не жадное) |
Если A и B — регулярные выражения, то их конкатенация AB является новым регулярным выражением, причем конкатенация строк a и b будет удовлетворять AB, если a удовлетворяет A и b удовлетворяет B. Можно считать, что конкатенация — основной способ составления регулярных выражений.
Скобки, описанные ниже, применяются для задания приоритетов и выделения групп (фрагментов текста, которые потом можно получить по номеру или из словаря, и даже сослаться в том же регулярном выражении).