Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
111 lines (72 sloc) 6.85 KB
title permalink
16 — Поиск с регулярными выражениями
/16/

На прошлом занятии

  • вложенные словари
  • модуль collections
  • пример: частотный словарь

План этого занятия

  • Регулярные выражения и их синтаксис
  • Модуль стандартной библиотеки re и функции re.search

Регулярные выражения и их синтаксис

Регулярные выражения (RE, regexp) нужны, чтобы находить в строках подстроки не по точному вхождению, а описываемые правилами-шаблонами.

! Если нужно найти точное вхождение, лучше использовать стандартные методы строк, а не re.

Специальные символы, с помощью которых мы будем задавать правила поиска строк:

  • . один любой символ
  • ? 0 или 1 вхождение предыдущего символа
  • * предыдущий символ повторяется ≥ 0 раз (0, 1, 2, 3 и т. д.)
  • + предыдущий символ повторяется ≥ 1 раз (1, 2, 3 и т. д.)
  • ^ начало строки
  • $ конец строки
  • [abc] «или»: любой из символов а, b, c
  • [а-я] любая буква русского алфавита от «а» до «я» Внутри квадратных скобок большинство специальных символ не действуют: . обозначает точку, ? — вопросительный знак. Вне квадратных скобок, чтобы получить точку или, например, плюс, специальные символы надо экранировать с помощью \ (\. обозначает точку, \+ обозначает плюс).
  • [^abc] — отрицание: любой символ, кроме a, b, c.
  • \d любая цифра, аналогично [0-9]
  • \D — любой символ, кроме цифр (отрицание \d или [^0-9])
  • \w — буквы, цифры, _ (то же, что [a-zA-Z0-9_]), \W — всё кроме букв, цифр, _.
  • \s — любой пробелоподбный символ ([ \t\n\r\f\v]), \S — любой непробелоподбный символ

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

Официальный HOWTO

Мы будем использовать модуль re:

import re

Функция re.search(pattern, string) возвращает первое вхождение подстроки, которая подходит под регулярное выражение. Обратите внимание на порядок аргументов: первый — это регулярное выражение, второй — исходная строка, в которой мы ищем.

first_match = re.search('кот.', 'Кот пришёл к коту и спросил кота: «Бойкот, котелок или скотч?»')

re.search возвращает объект match (или None, если ничего не нашлось), из которого затем можно извлечь результат методом group():

if first_match:
    first_match.group()    # 'кот '
else:
    print('Nothing found.')

Ещё одна полезная функция re.findall(pattern, string) находит все вхождения подходящих строк:

all_results = re.findall('кот.', 'кот пришёл к коту и спросил кота: «Бойкот, котелок или скотч?»')
all_results    # ['кот ', 'коту', 'кота', 'кот,', 'коте', 'котч']

Если в регулярном выражениии используются специальные значения с \, то лучше использовать синтаксис для «сырых» (raw) строк. Приведем простой пример использования «сырых» строк: предположим, что нужно написать строку, которая бы содержала два подряд идущих символа: \ и n. Мы уже знаем, что если просто написать '\n', то Python превратит это сочетание в символ переноса строки. Однако, если написать r'\n', то Python не будет производить никаких преобразований внутри этой строки.

Найдем все числа в строке:

digits_list = re.findall(r'\d', 'Я родился 30 февраля 1930 года')
digits_str = ''.join(digits)    # '301930'

Домашнее задание

В этом домашнем задании программа должна открывать файл с русским текстом в кодировке UTF-8 и распечатывать из него по одному разу все встретившиеся в нём (в зависимости от варианта):

  1. формы глагола «закрыть»
  2. формы глагола «выйти»
  3. формы глагола «бравировать»
  4. формы глагола «вылить»
  5. формы глагола «съездить»
  6. формы глагола «занизить»
  7. формы глагола «надеть»

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

Решить задание следует с помощью применения регулярных выражений.

Выполните задание пройдя по ссылке в GitHub Classroom:

You can’t perform that action at this time.