Кванторы: *, +, ?, {n,m}

Управляем тем, сколько раз должен повториться предыдущий элемент.

Квантор — указатель количества повторений предыдущего символа или группы.

Четыре базовых квантора

Квантор ставится после символа, класса или группы и говорит, сколько раз их повторить:

КванторСколько раз
*ноль или более
+один или более
?ноль или один (необязательно)
{n}ровно n раз
{n,m}от n до m раз
{n,}n и более раз

Звёздочка и плюс

Разница между * и + в том, допустимо ли ноль повторений. Паттерн ab* — это «a, затем сколько угодно b (в том числе ни одного)», а ab+ требует хотя бы одну b:

import re

print(re.findall(r"ab*", "a ab abb abbb"))
print(re.findall(r"ab+", "a ab abb abbb"))

Вывод:

['a', 'ab', 'abb', 'abbb']
['ab', 'abb', 'abbb']

С ab* одинокая a тоже совпала (ноль b допустимо). С ab+ её нет — нужна хотя бы одна b.

Вопрос — необязательный элемент

Квантор ? делает предыдущий элемент необязательным. Классика — британское и американское написание «цвета»:

import re

print(re.findall(r"colou?r", "color и colour"))

Вывод:

['color', 'colour']

Буква u с квантором ? может быть, а может и не быть — оба слова подошли.

Фигурные скобки — точное количество

Когда нужно конкретное число повторений, используют {...}. Например, ровно четыре цифры — год:

import re

print(re.findall(r"\d{4}", "2024 99 12345"))   # ровно 4 цифры
print(re.findall(r"\d{2,4}", "1 12 123 12345")) # от 2 до 4
print(re.findall(r"\d{2,}", "1 12 123"))         # 2 и более

Вывод:

['2024', '1234']
['12', '123', '1234']
['12', '123']

Любопытно с \d{4} на строке 12345: движок взял первые четыре цифры (1234), а пятая осталась без пары. А \d{2,4} на 12345 жадно захватил максимум — четыре цифры. О жадности — в следующем уроке.

Квантор применяется к одному элементу

Важно: квантор относится к тому, что стоит прямо перед ним. В ab+ плюс относится только к b, а не ко всему ab. Чтобы повторять целую последовательность, её берут в группу: (ab)+ — об этом в разделе про группы.

Итог

  • * — ноль и более, + — один и более, ? — ноль или один.
  • {n} — ровно n, {n,m} — от n до m, {n,} — n и более.
  • Квантор действует на ближайший слева элемент, а не на всё выражение.
Проверьте себя
1. Чем отличается a* от a+?
AНичем, это синонимы
Ba* допускает ноль повторений a, a+ требует хотя бы одно
Ca+ допускает ноль, a* требует хотя бы одно
Da+ ищет только заглавные A
2. Что означает квантор ? после символа, например colou?r?
AЛюбое количество u
Bu обязателен ровно один раз
Cu необязателен: ноль или один раз
DЭто синтаксическая ошибка
3. Чему соответствует \d{2,4}?
AРовно 2 или ровно 4 цифры
BОт 2 до 4 цифр подряд
CМинимум 24 цифры
DДве цифры и запятую
Поддержать проект