Кванторы: *, +, ?, {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 и более.- Квантор действует на ближайший слева элемент, а не на всё выражение.