Опубликован: 22.12.2005 | Доступ: свободный | Студентов: 16680 / 512 | Оценка: 4.18 / 3.71 | Длительность: 16:16:00
ISBN: 978-5-9556-0109-0
Лекция 6:

Обработка текстов. Регулярные выражения. Unicode

Регулярные выражения

Рассмотренных стандартных возможностей для работы с текстом достаточно далеко не всегда. Например, в методах 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. Можно считать, что конкатенация - основной способ составления регулярных выражений.

Скобки, описанные ниже, применяются для задания приоритетов и выделения групп (фрагментов текста, которые потом можно получить по номеру или из словаря, и даже сослаться в том же регулярном выражении).

Алгоритм, который сопоставляет строки с регулярным выражением, проверяет соответствие того или иного фрагмента строки регулярному выражению. Например, строка "a" соответствует регулярному выражению "[a-z]", строка "fruit" соответствует "fruit|vegetable", а вот строка "apple" не соответствует шаблону "pineapple".

В таблице ниже вместо регвыр может быть записано регулярное выражение, вместо имя - идентификатор, а флаги будут рассмотрены ниже.

Обозначение Описание
"(регвыр)" Обособляет регулярное выражение в скобках и выделяет группу
"(?:регвыр)" Обособляет регулярное выражение в скобках без выделения группы
"(?=регвыр)" Взгляд вперед: строка должна соответствовать заданному регулярному выражению, но дальнейшее сопоставление с шаблоном начнется с того же места
"(?!регвыр)" То же, но с отрицанием соответствия
"(?<=регвыр)" Взгляд назад: строка должна соответствовать, если до этого момента соответствует регулярному выражению. Не занимает места в строке, к которой применяется шаблон. Параметр регвыр должен быть фиксированной длины (то есть, без "+" и "*" )
"(?<!регвыр)" То же, но с отрицанием соответствия
"(?P<имя>регвыр)" Выделяет именованную группу с именем имя
"(?P=имя)" Точно соответствует выделенной ранее именованной группе с именем имя
"(?#регвыр)" Комментарий (игнорируется)
"(?(имя)рв1|рв2)" Если группа с номером или именем имя оказалась определена, результатом будет сопоставление с рв1, иначе - c рв2. Часть |рв2 может отсутствовать
"(?флаг)" Задает флаг для всего данного регулярного выражения. Флаги необходимо задавать в начале шаблона

В таблице ниже описаны специальные последовательности, использующие обратную косую черту:

Последовательность Чему соответствует
"\1" - "\9" Группа с указанным номером. Группы нумеруются, начиная с 1
"\A" Промежуток перед началом всей строки (почти аналогично "^" )
"\Z" Промежуток перед концом всей строки (почти аналогично "$" )
"\b" Промежуток между символами перед словом или после него
"\B" Наоборот, не соответствует промежутку между символами на границе слова
"\d" Цифра. Аналогично "[0-9]"
"\s" Любой пробельный символ. Аналогично "[\t\n\r\f\v]"
"\S" Любой непробельный символ. Аналогично "[^\t\n\r\f\v]"
"\w" Любая цифра или буква (зависит от флага LOCALE )
"\W" Любой символ, не являющийся цифрой или буквой (зависит от флага LOCALE )

Флаги, используемые с регулярными выражениями:

"(?i)", re.I, re.IGNORECASE

Сопоставление проводится без учета регистра букв.

"(?L)", re.L, re.LOCALE

Влияет на определение буквы в "\w", "\W", "\b", "\B" в зависимости от текущей культурной среды (locale).

"(?m)", re.M, re.MULTILINE

Если этот флаг задан, "^" и "$" соответствуют началу и концу любой строки.

"(?s)", re.S, re.DOTALL

Если задан, "." соответствует также и символу конца строки "\n".

"(?x)", re.X, re.VERBOSE

Если задан, пробельные символы, не экранированные в шаблоне обратной косой чертой, являются незначащими, а все, что расположено после символа "#", -- комментарии. Позволяет записывать регулярное выражение в несколько строк для улучшения его читаемости и записи комментариев.

"(?u)", re.U, re.UNICODE

В шаблоне и в строке использован Unicode.

Андрей Егоров
Андрей Егоров

def bin(n):

"""Цифры двоичного представления натурального числа """

if n == 0:

   return []

n, d = divmod(n, 2)

return bin(n) + [d]

print bin(69)

Что значит здесь return[] ? Возвращает список? Непонятно какой список? Откуда он? 

 

 

Асмик Гаряка
Асмик Гаряка

Почему при вычислении рейтинга не учитывается уровень, как описано? Для всех курсов У=1, хотя для Специалист должно быть 2.

Дмитрий Штерхун
Дмитрий Штерхун
Россия, г. Санкт-Петербург
Игорь Бочко
Игорь Бочко
Украина, Харьков