Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Классы символов
character_classes

Классы символов

Предопределённые и пользовательские классы символов, инверсия

Классы символов

Классы символов позволяют указать набор допустимых символов для одной позиции в шаблоне. Это мощный инструмент для гибкого поиска.

#Синтаксис классов символов

Класс символов задаётся в квадратных скобках [] и соответствует одному любому символу из набора:

import re # Любая гласная re.search(r'[aeiou]', 'hello') # 'e' # Любая цифра re.search(r'[0123456789]', 'abc5def') # '5' # Любая буква из набора re.search(r'[abc]', 'dog') # None re.search(r'[abc]', 'cat') # 'a'

#Диапазоны символов

Для указания диапазона используйте дефис -:

# Любая строчная буква re.search(r'[a-z]', 'Hello') # 'e' # Любая заглавная буква re.search(r'[A-Z]', 'Hello') # 'H' # Любая цифра re.search(r'[0-9]', 'abc123') # '1' # Комбинированные диапазоны re.search(r'[a-zA-Z]', '123') # None re.search(r'[a-zA-Z]', 'abc') # 'a'

#Несколько диапазонов в одном классе

# Буквы и цифры re.search(r'[a-zA-Z0-9]', 'test_123') # 't' # Гласные и цифры re.search(r'[aeiou0-9]', 'hello123') # 'e'

#Инвертированный класс (negated class)

^ в начале класса означает отрицание — любой символ, КРОМЕ указанных:

# Любая цифра re.search(r'[0-9]', 'abc5def') # '5' # Любой символ, кроме цифры re.search(r'[^0-9]', 'abc5def') # 'a' # Любая буква, кроме гласных (согласные) re.search(r'[^aeiouAEIOU]', 'hello') # 'h'

Важно: ^ работает как инверсия только внутри [] и только в начале. В других позициях это literal ^.

re.search(r'[a-z^]', 'a^b') # '^' — здесь ^ это literal re.search(r'^[a-z]', 'abc') # 'a' — здесь ^ это якорь начала

#Предопределённые классы символов

Python предоставляет готовые классы через escape-последовательности:

КлассЗначениеЭквивалент
\dЦифра[0-9]
\DНе цифра[^0-9]
\wWord-символ[a-zA-Z0-9_]
\WНе word-символ[^a-zA-Z0-9_]
\sПробельный символ[ \t\n\r\f\v]
\SНе пробельный символ[^ \t\n\r\f\v]

#\d — цифры

re.search(r'\d', 'abc123') # '1' re.search(r'\d+', 'abc123') # '123' — одна или более цифр re.search(r'\D', '123abc') # 'a' re.search(r'\D+', '123abc') # 'abc'

#\w — word-символы

re.search(r'\w', 'hello_world') # 'h' re.search(r'\w+', 'hello world') # 'hello' re.search(r'\W', 'hello world') # ' ' (пробел) re.search(r'\W+', 'hello world') # ' ' (пробелы)

Важно: \w включает подчёркивание _, но не включает дефис -, точку . и другие спецсимволы.

#\s — пробельные символы

re.search(r'\s', 'hello world') # ' ' (пробел) re.search(r'\s+', 'hello world') # ' ' (несколько пробелов) re.search(r'\s', 'hello\tworld') # '\t' (табуляция) re.search(r'\s', 'hello\nworld') # '\n' (newline) re.search(r'\S', ' abc') # 'a' (первый непробельный)

#Классы символов в практических задачах

#1. Валидация простого идентификатора

# Идентификатор: буква или подчёркивание, затем буквы/цифры/подчёркивания pattern = r'^[a-zA-Z_]\w*$' re.match(pattern, 'variable') # Match re.match(pattern, '_private') # Match re.match(pattern, 'var123') # Match re.match(pattern, '123var') # None — начинается с цифры re.match(pattern, 'my-var') # None — дефис не входит в \w

#2. Поиск чисел в тексте

text = 'Цена: 1234 руб., скидка 5%' # Все числа re.findall(r'\d+', text) # ['1234', '5'] # Числа с пробелами как разделителями тысяч text = 'Цена: 1 234 567 руб.' re.findall(r'[\d ]+', text) # ['1 234 567']

#3. Извлечение слов

text = 'Hello, world! Это тест.' # Только латинские слова re.findall(r'[a-zA-Z]+', text) # ['Hello', 'world'] # Слова с подчёркиванием re.findall(r'\w+', text) # ['Hello', 'world', 'Это', 'тест']

#4. Валидация шестнадцатеричного цвета

# HEX-цвет: # и 6 hex-символов pattern = r'^#[0-9a-fA-F]{6}$' re.match(pattern, '#FF5733') # Match re.match(pattern, '#ff5733') # Match re.match(pattern, '#GGGGGG') # None — G не hex-символ re.match(pattern, 'FF5733') # None — нет #

#Специальные символы внутри классов

Некоторые символы внутри [] теряют специальное значение:

# Точка внутри [] — literal точка re.search(r'[.]', 'abc.def') # '.' re.search(r'[.]', 'abcdef') # None # Звёздочка внутри [] — literal звёздочка re.search(r'[*]', 'a*b') # '*' # Плюс внутри [] — literal плюс re.search(r'[+]', 'a+b') # '+'

#Символы, требующие экранирования внутри []

# ] требует экранирования re.search(r'[\]]', 'a]b') # ']' re.search(r'[\[\]]', 'a[b') # '[' re.search(r'[\[\]]', 'a]b') # ']' # ^ в начале — инверсия, в другом месте — literal re.search(r'[a^b]', 'a^b') # '^' re.search(r'[a^b]', 'abc') # 'a' # - в начале или конце — literal, в середине — диапазон re.search(r'[-abc]', '-abc') # '-' re.search(r'[abc-]', 'abc-') # '-' re.search(r'[a-z]', 'm') # 'm' — диапазон

#Unicode и классы символов

В Python 3 \w, \d, \s по умолчанию работают с Unicode:

# Кириллица входит в \w re.search(r'\w+', 'Привет мир') # 'Привет' # Но \w несоответствует пробел re.search(r'\w+', 'Привет мир') # 'Привет', не 'Привет мир' # Для всех букв используйте Unicode-категории re.search(r'[\w\s]+', 'Привет мир') # 'Привет мир'

#Флаг re.ASCII

Для ограничения \w, \d, \s только ASCII-символами:

# По умолчанию (Unicode): re.search(r'\w+', 'Привет') # 'Привет' # Только ASCII: re.search(r'\w+', 'Привет', re.ASCII) # None re.search(r'\w+', 'Hello', re.ASCII) # 'Hello'

#Распространённые ошибки

#1. Забытые скобки для класса

# Ошибка: ищет literal символы [0-9] re.search(r'[0-9]', 'abc5') # '5' — правильно # Ошибка: без скобок ищет '0', '-', '9' по отдельности re.search(r'0-9', '0-9') # '0-9' — это не класс!

#2. Неправильная инверсия

# Ошибка: думают, что [^a-z]соответствует заглавные буквы re.search(r'[^a-z]', 'ABC') # 'A' — правильно, но... re.search(r'[^a-z]', '123') # '1' — цифры тоже! # Для только заглавных используйте [A-Z] re.search(r'[A-Z]', 'ABC') # 'A'

#3. Дефис не в том месте

# Ошибка: дефис в середине воспринимается как диапазон re.search(r'[a-z-]', 'abc-') # '-' — правильно re.search(r'[a--z]', 'abc') # Ошибка: диапазон a- до z # Правильно: дефис в начале или конце re.search(r'[-a-z]', '-abc') # '-' re.search(r'[a-z-]', 'abc-') # '-'

Далее: Квантификаторы