Литералы и метасимволы, точка и экранирование

Понимаем, какие символы в паттерне обычные, а какие имеют особый смысл, и как это контролировать.

Метасимвол — символ с особым значением в регулярках (например, точка или звёздочка); чтобы искать его буквально, его экранируют обратным слэшем.

Литералы: ищем текст как есть

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

import re

print(re.findall(r"кот", "кот, котёнок, мой кот"))

Вывод:

['кот', 'кот', 'кот']

Функция re.findall вернула список всех совпадений. «кот» нашёлся и внутри «котёнок» — потому что мы пока не задали границы слова (об этом позже).

Метасимволы: символы со смыслом

Некоторые символы в регулярках зарезервированы и означают не себя, а правило. Это метасимволы:

. ^ $ * + ? { } [ ] \ | ( )

Например, точка . означает «любой одиночный символ» (кроме перевода строки). Звёздочка, плюс и фигурные скобки — кванторы (сколько раз повторить). Квадратные скобки — класс символов. Их мы изучим в следующих разделах, а пока запомните: эти символы «волшебные».

Точка — любой символ

Точка совпадает с любым одним символом. Паттерн c.t — это «c, потом любой символ, потом t»:

import re

print(re.findall(r"c.t", "cat cot cut c t c-t"))

Вывод:

['cat', 'cot', 'cut', 'c t', 'c-t']

Точка поймала и букву, и пробел, и дефис — всё, что стоит между c и t. Это мощно, но осторожно: точка часто матчит больше, чем хотелось бы.

Экранирование: ищем метасимвол буквально

А если нужно найти именно точку — например, в дробном числе 3.14? Тогда метасимвол экранируют обратным слэшем: \. означает «настоящая точка». Сравните:

import re

text = "Версия 3.14 и адрес 3x14"
print(re.findall(r"\d+\.\d+", text))   # цифры, ТОЧКА, цифры
print(re.findall(r"\d+.\d+", text))    # цифры, любой символ, цифры

Вывод:

['3.14']
['3.14', '3x14']

С экранированной точкой \. нашлось только число 3.14. С обычной точкой . совпал и 3x14 — ведь точка значит «любой символ», и x ей подошёл. Правило простое: хотите найти метасимвол как обычный символ — поставьте перед ним обратный слэш. Так экранируют \., \$, \(, \+ и другие.

Итог

  • Литералы (обычные буквы) ищут себя; метасимволы (. ^ $ * + ? { } [ ] \ | ( )) имеют особый смысл.
  • Точка . совпадает с любым одиночным символом, кроме перевода строки.
  • Чтобы искать метасимвол буквально, экранируйте его слэшем: \., \$, \(.
Проверьте себя
1. Что означает точка . в регулярном выражении?
AТолько символ точки «.»
BЛюбой одиночный символ (кроме перевода строки)
CКонец строки
DЛюбую цифру
2. Как в паттерне найти именно символ доллара $?
AПросто написать $
BНаписать \$ — экранировать его обратным слэшем
CНаписать [$] нельзя, только текстом
DДоллар найти регуляркой невозможно
3. Сколько совпадений даст findall с паттерном c.t в строке "cat c t cut"?
AТолько cat
Bcat, c t и cut — три совпадения
CНи одного
DТолько cut
Поддержать проект