Опубликован: 14.06.2015 | Доступ: свободный | Студентов: 7361 / 1131 | Длительность: 09:49:00
Авторские права: Creative Commons Attribution 3.0
Самостоятельная работа 11:

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

< Самостоятельная работа 1 || Самостоятельная работа 11: 12345

По ссылке youtube выложено видео с русскими титрами.

Ранее нам часто приходилось, читая файлы, искать текстовые шаблоны и извлекать нужные нам фрагменты строк. Для этого мы применяли строковые методы, такие как split (расщепление) и find (поиск), и использовали списки и подстроки для выделения частей строк.

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

Регулярные выражения представляют собой почти что небольшой самостоятельный язык программирования для поиска и разбора строк. Ему зачастую посвящают целые книги. В этой главе мы затронем лишь базовые возможности регулярных выражений. Более детальное описание доступно по адресам: http://en.wikipedia.org/wiki/Regular_expression и http://docs.python.org/library/re.html.

Библиотека для работы с регулярными выражениями должна быть импортирована в вашу программу. Простейший пример использования регулярных выражений – функция поиска search(). Следующая программа демонстрирует тривиальное использование функции поиска.

import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
if re.search('From:', line) :
print line
  

Здесь открывается файл и в цикле просматриваются все его строки; функция поиска регулярного выражения search() используется только для того, чтобы напечатать строки, содержащие фрагмент "From:". Данная программа не использует всей силы регулярных выражений, поскольку мы могли бы попросту воспользоваться строковым методом line.find() и получить тот же самый результат. Сила регулярных выражений раскрывается, когда мы добавляем специальные символы в шаблон поиска, что позволяет более точно задавать соответствие строк шаблону. Применение этих специальных символов в регулярном выражении дает возможность устанавливать сложное сопоставление и извлечение фрагментов текста с помощью совсем короткого программного кода.

Например, символ "^" (крышка) в регулярном выражении означает фрагмент в начале строки. Можно изменить нашу программу так, чтобы она находила только строки, содержащие слово "From: " в начале строки:

import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
if re.search('^From:', line) :
print line
  

Теперь шаблону сопоставляются только строки, начинающиеся с фрагмента "From: ". Это всё ещё совсем простой пример, который мы могли бы реализовать и с использованием метода startswith() из библиотеки работы со строками. Но он показывает, как специальные символы в регулярных выражениях расширяют наши возможности при сопоставлении фрагментов текста шаблону поиска.

23.1. Сопоставление символов в регулярных выражениях

Имеется ряд других специальных символов, дающих возможность строить еще более эффективные регулярные выражения. Наиболее часто используемый специальный символ – это точка, которая сопоставляется любому символу.

В следующем примере регулярное выражение "F..m:" сопоставляется любой из строк "From:", "Fxxm:", "F12m:", or "F!@m:", поскольку точка в регулярном выражении соответствует любому символу.

import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
if re.search('^F..m:', line) :
print line
  

Это особенно эффективно в сочетании с возможностью указать, что символ может быть повторен произвольное количество раз, – для этого в регулярном выражении применяются специальные символы "*" или "+". Они означают, что вместо одного символа строки поиска сопоставляется ноль или более символов в случае звёздочки и один или более символов в случае знака плюс.

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

import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
if re.search('^From:.+@', line) :
print line
  

Шаблон поиска "^From:.+@" успешно сопоставляется всем строкам, начинающимся со слова "From:", за которым следует один или более произвольных символов и затем символ @. Например, он соответствует следующей строке:

From: stephen.marquard@uct.ac.za

Часть шаблона ".+" можно представлять себе как фрагмент, который расширяется до соответствия всем символам между двоеточием и символом @.

From:.+@

Удобно представлять плюс и звездочку как расширяющие символы. Например, в следующей строке символу @ шаблона будет соответствовать последний символ @ строки, тогда как фрагмент ".+" шаблона расширяется до всех символов после двоеточия, предшествующих ему:

From: stephen.marquard@uct.ac.za, csev@umich.edu, and cwen@iupui.edu

Можно заставить звездочку или плюс не быть столь "ненасытными", добавив другой специальный символ – см. подробную документацию по выключению их "жадного" поведения.

< Самостоятельная работа 1 || Самостоятельная работа 11: 12345
Алексей Виноградов
Алексей Виноградов

Видеокурс выложен на сайте Altube.ru вместо Youtube и плеер Altube не поддерживает субтитры. Прошу решить вопрос о предоставлении русских субтитров в этом англоязычном видеокурсе.

Петр Олейников
Петр Олейников

Данные файлы неоходимы не только для самостоятельных работ, но и для тестов. А по ссылкам в лекциях они не доступны, выдает ошибку 404.