Классы символов: [...], диапазоны и отрицание

Описываем «любой символ из набора» с помощью квадратных скобок.

Класс символов [...] совпадает с одним символом из перечисленных внутри скобок.

Перечисление символов

Квадратные скобки задают набор: совпадёт любой один символ из перечисленных. Паттерн gr[ae]y читается как «g, r, потом a или e, потом y» — то есть оба написания слова «серый» по-английски:

import re

print(re.findall(r"gr[ae]y", "gray grey groy"))

Вывод:

['gray', 'grey']

Внутри скобок [ae] — это «a или e», но ровно один символ. groy не подошёл: o нет в наборе.

Диапазоны

Перечислять все буквы утомительно, поэтому внутри скобок задают диапазоны через дефис: [a-z] — все строчные латинские буквы, [A-Z] — заглавные, [0-9] — цифры. Диапазоны можно комбинировать:

import re

text = "Go2Py_3 ага"
print(re.findall(r"[a-zA-Z]", text))   # любые латинские буквы
print(re.findall(r"[0-9]", text))       # любые цифры
print(re.findall(r"[a-zA-Z0-9]+", text)) # буквы и цифры подряд

Вывод:

['G', 'o', 'P', 'y']
['2', '3']
['Go2Py', '3']

Подчёркивание и пробел в класс [a-zA-Z0-9] не вошли, поэтому Go2Py и 3 разбились на части.

Отрицание [^...]

Если первый символ внутри скобок — ^, класс инвертируется: совпадёт любой символ, кроме перечисленных. [^0-9] — это «любой нецифровой символ»:

import re

print(re.findall(r"[^0-9]", "a1b2c3"))

Вывод:

['a', 'b', 'c']

Удобный приём — очистить строку, оставив только нужные символы. Уберём из текста всё, кроме русских букв и пробелов:

import re

text = "Привет, мир123! Как дела?"
print(re.sub(r"[^а-яёА-ЯЁ ]", "", text))

Вывод:

Привет мир Как дела

Класс [^а-яёА-ЯЁ ] поймал цифры и знаки препинания, а re.sub заменил их на пустую строку.

Особенности внутри скобок

Внутри [...] большинство метасимволов теряют силу и означают себя: точка . внутри класса — это просто точка, её не надо экранировать. Дефис ставьте первым или последним ([-+]), чтобы он не воспринимался как диапазон. А ^ особый только в самом начале.

Итог

  • [abc] — один символ из набора; [a-z], [0-9] — диапазоны.
  • [^...] — любой символ, КРОМЕ перечисленных.
  • Внутри скобок метасимволы (например точка) обычно означают сами себя.
  • Связка re.sub + отрицающий класс — простой способ почистить строку.
Проверьте себя
1. Чему соответствует класс [aeiou]?
AСлову aeiou целиком
BОдному символу — любой из гласных a, e, i, o, u
CПяти любым символам подряд
DЛюбому символу, кроме гласных
2. Что означает [^0-9]?
AЛюбую цифру
BЛюбой символ, кроме цифр
CНачало строки и цифру
DСтепень числа
3. Нужно ли экранировать точку внутри класса, например [a.b]?
AДа, иначе будет ошибка
BНет, внутри [...] точка означает обычную точку
CТочку вообще нельзя писать в классе
DДа, она там значит «любой символ»
Поддержать проект