Литералы и метасимволы, точка и экранирование
Понимаем, какие символы в паттерне обычные, а какие имеют особый смысл, и как это контролировать.
Метасимвол — символ с особым значением в регулярках (например, точка или звёздочка); чтобы искать его буквально, его экранируют обратным слэшем.
Литералы: ищем текст как есть
Самый простой паттерн — это обычный текст. Буквы и большинство символов в регулярке означают сами себя, их называют литералами. Паттерн кот просто ищет подстроку «кот»:
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 ей подошёл. Правило простое: хотите найти метасимвол как обычный символ — поставьте перед ним обратный слэш. Так экранируют \., \$, \(, \+ и другие.
Итог
- Литералы (обычные буквы) ищут себя; метасимволы (
. ^ $ * + ? { } [ ] \ | ( )) имеют особый смысл. - Точка
.совпадает с любым одиночным символом, кроме перевода строки. - Чтобы искать метасимвол буквально, экранируйте его слэшем:
\.,\$,\(.