На этом шаге мы познакомимся со множеством других регулярных выражений.
Чем больше регулярных выражений вы знаете, тем быстрее и лаконичнее сможете решать реальные задачи. Какие же регулярные выражения наиболее важны? Изучите следующий список внимательно, поскольку все эти выражения будут применяться далее. Можете считать те из них, которые уже видели выше, маленьким упражнением на повторение.
Рассмотрим короткий пример. Пускай мы создали регулярное выражение b?(.a)*. Каким комбинациям символов оно соответствует? Всем, начинающимся с символа b (он может и отсутствовать) и содержащим произвольное количество последовательностей из пар символов, заканчивающихся 'a'. Таким образом, ему соответствуют все следующие строковые значения: 'bcacaca', 'cadaea', '' (пустая строка) и 'aaaaaa'.
Прежде чем углубиться в следующий однострочник, вкратце поговорим о том, когда использовать ту или иную функцию регулярных выражений. Три важнейшие функции регулярных выражений - re.match(), re.search() и re.findall(). Две из них вы уже видели, но посмотрим на них внимательнее в следующем примере:
import re text = ''' "One can never have enough socks", said Dumbledore. "Another Christmas has come and gone and I didn't get a single pair. People will insist on giving me books." Christmas Quote ''' regex = 'Christ.*' print(re.match(regex, text)) # None print(re.search(regex, text)) # <re.Match object; span=(62, 102), match="Christmas has come and gone and I didn't"> print(re.findall(regex, text)) # ["Christmas has come and gone and I didn't", 'Christmas Quote']
Все три эти функции принимают на входе регулярное выражение и строковое значение, в котором производится поиск. Функции match() и search() возвращают объект Match (или None, если соответствия регулярному выражению не нашлось). В объекте Match хранится позиция найденного соответствия и дополнительная метаинформация. Функция match() не нашла соответствия регулярному выражению в нашей строке (вернула None). Почему? А потому, что эта функция ищет шаблон только с начала строки. Функция же search() ищет первое вхождение шаблона в любом месте строки. А потому находит соответствие "Christmas has come and gone and I didn't".
Результаты работы функции findall() наиболее интуитивно понятны, но и наименее удобны для дальнейшей обработки. Результаты работы функции findall() представляет собой последовательность строковых значений, а не объект Match, поэтому точной информации о месте вхождения они не дают. Тем не менее функция findall() также бывает полезна: в отличие от методов match() и search(), функция findall() извлекает все подходящие шаблоны символов. Это удобно, если требуется найти количество вхождений слова в тексте (например, строки символов 'Джульетта' в тексте "Ромео и Джульетты" или строки символов 'crypto' в статье о криптовалютах).
На следующем шаге мы закончим изучение этого вопроса.