Part 12

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

Мы уже установили, что Python — отличная среда для обработки текста. Еще один мощный инструмент для обработки текста — регулярные выражения, часто сокращенно называемые regex или regexp. Это способ выбирать и искать строки, которые следуют определенному шаблону. В этом разделе представлены основы регулярных выражений, но гораздо больше информации можно найти онлайн, в том числе в руководстве Python.

Что такое регулярные выражения?

Регулярные выражения — это не только возможность Python. В некотором смысле они представляют собой язык программирования внутри языка программирования. В определенной степени они совместимы во многих разных языках программирования. У регулярных выражений есть собственный особый синтаксис. Идея в том, чтобы определить набор строк, которые следуют определенным правилам.

Начнем с простого примера, прежде чем углубляться в синтаксис:

import re

words = ["Python", "Pantone", "Pontoon", "Pollute", "Pantheon"]

for word in words:
    # the string should begin with "P" and end with "on"
    if re.search("^P.*on$", word):
        print(word, "found!")
Пример вывода

Python found! Pontoon found! Pantheon found!

Чтобы использовать регулярные выражения в Python, нужно импортировать модуль re. Модуль re содержит много функций для работы с регулярными выражениями. В примере выше функция search принимает два строковых аргумента: строку с шаблоном и целевую строку, в которой ищется шаблон.

Этот второй пример ищет любые числа в строке. Функция findall возвращает список всех фрагментов, которые соответствуют шаблону:

import re

sentence = "First, 2 !#third 44 five 678xyz962"

numbers = re.findall("\d+", sentence)

for number in numbers:
    print(number)
Пример вывода

2 44 678 962

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

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

import re

expression = input("Please type in an expression: ")

while True:
    input_string = input("Please type in a string: ")
    if input_string == "":
        break
    if re.search(expression, input_string):
        print("Found!")
    else:
        print("Not found.")

Альтернативные подстроки

Вертикальная черта |, также называемая символом pipe, позволяет искать альтернативные подстроки. Поэтому ее значение — или. Например, выражение 911|112 соответствует строкам, которые содержат либо подстроку 911, либо подстроку 112.

Пример с тестовой программой:

Пример вывода

Please type in an expression: aa|ee|ii Please type in a string: aardvark Found! Please type in a string: feelings Found! Please type in a string: radii Found! Please type in a string: smooch Not found. Please type in a string: continuum Not found.

Группы символов

Квадратные скобки используются для обозначения групп допустимых символов. Например, выражение [aeio] соответствовало бы всем строкам, которые содержат любой из символов a, e, i или o.

Дефис также можно использовать для сопоставления диапазонов символов. Например, выражение [0-68a-d] соответствовало бы всем строкам, которые содержат цифру от 0 до 6, либо восьмерку, либо символ от a до d. В этой записи все диапазоны включительные.

Объединение двух наборов скобок позволяет сопоставить два последовательных символа. Например, выражение [1-3][0-9] соответствовало бы любому двузначному числу от 10 до 39 включительно.

Пример с тестовой программой:

Пример вывода

Please type in an expression: [C-FRSO] Please type in a string: C Found! Please type in a string: E Found! Please type in a string: G Not found. Please type in a string: R Found! Please type in a string: O Found! Please type in a string: T Not found.

Повторяющиеся совпадения

Любую часть выражения можно повторять с помощью следующих операторов:

  • * повторяет любое количество раз, включая ноль
  • + повторяет любое количество раз, но как минимум один раз
  • {m} повторяет ровно m раз

Эти операторы работают с частью выражения, которая находится непосредственно перед оператором. Например, выражение ba+b соответствовало бы подстрокам bab, baab и baaaaaaaaaaab, среди прочих. Выражение A[BCDE]*Z соответствовало бы подстрокам AZ, ADZ или ABCDEBCDEBCDEZ, среди прочих.

Пример с тестовой программой:

Пример вывода

Please type in an expression: 1[234]*5 Please type in a string: 15 Found! Please type in a string: 125 Found! Please type in a string: 145 Found! Please type in a string: 12342345 Found! Please type in a string: 126 Not found. Please type in a string: 165 Not found.

Другие специальные символы

Точка — это подстановочный символ, который может соответствовать любому одному символу. Например, выражение c...o соответствовало бы любой пятисимвольной подстроке, начинающейся с c и заканчивающейся на o, например c-3po или cello.

Символ ^ задает, что совпадение должно находиться в начале строки, а $ задает, что совпадение должно находиться в конце строки. Их также можно использовать, чтобы исключить из совпадений любые символы, кроме указанных:

Пример вывода

Please type in an expression: ^[123]*$ Please type in a string: 4 Not found. Please type in a string: 1221 Found! Please type in a string: 333333333 Found!

Иногда нужно сопоставлять специальные символы, зарезервированные для синтаксиса регулярных выражений. Обратную косую черту \ можно использовать, чтобы экранировать специальные символы. Так, выражение 1+ соответствует одному или нескольким числам 1, а выражение 1\+ соответствует строке 1+.

Пример вывода

Please type in an expression: ^\* Please type in a string: moi* Not found. Please type in a string: m*o*i Not found. Please type in a string: *moi Found!

Круглые скобки можно использовать для группировки разных частей выражения. Например, выражение (ab)+c соответствовало бы подстрокам abc, ababc и ababababababc, но не строкам ac или bc, потому что вся подстрока ab должна появиться хотя бы один раз.

Пример вывода

Please type in an expression: ^(jabba).*(hut)$ Please type in a string: jabba the hut Found! Please type in a string: jabba a hut Found! Please type in a string: jarjar the hut Not found. Please type in a string: jabba the smut Not found.

Loading

Большой финал

Чтобы завершить эту часть материала, поработаем еще немного с объектами и классами, создав чуть более обширную программу. Это упражнение не обязательно связано с регулярными выражениями, но разделы о функциях как аргументах и генераторах списков, скорее всего, будут полезны.

Также вам может помочь набор примеров из части 10.

Loading

Ответьте, пожалуйста, на короткий опрос по этой части курса.

Вы дошли до конца этого раздела!

Текущие баллы можно посмотреть в синем индикаторе в правом нижнем углу страницы.