Регулярные выражения
Мы уже установили, что 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.
Большой финал
Чтобы завершить эту часть материала, поработаем еще немного с объектами и классами, создав чуть более обширную программу. Эт о упражнение не обязательно связано с регулярными выражениями, но разделы о функциях как аргументах и генераторах списков, скорее всего, будут полезны.
Также вам может помочь набор примеров из части 10.
Ответьте, пожалуйста, на короткий опрос по этой части курса.
Текущие баллы можно посмотреть в синем индикаторе в правом нижнем углу страницы.