← Назад к вопросам

Что такое плюс в регулярных выражениях?

2.0 Middle🔥 151 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Плюс в регулярных выражениях

Плюс (+) в регулярных выражениях — это квантификатор, который означает "один или более повторений". Он говорит, что символ (или группа символов) перед ним должен встречаться как минимум один раз.

Базовая концепция

У каждого квантификатора есть свой смысл:

  • ? — 0 или 1 повторение (опционально)
  • * — 0 или более повторений (может быть вообще не встречаться)
  • + — 1 или более повторений (обязательно хотя бы один раз)
  • {n} — ровно n повторений
  • {n,m} — от n до m повторений

Примеры с плюсом

import re

# Простой пример: один или более символов 'a'
pattern = 'a+'
text = 'aaa'
match = re.search(pattern, text)
print(match.group())  # 'aaa' (все три 'a')

# Без плюса или звезды — только один символ
pattern = 'a'
match = re.search(pattern, text)
print(match.group())  # 'a' (только первый)

Плюс "жадный" по умолчанию — он берет как можно больше повторений.

Практические примеры

Поиск слов (последовательность букв):

pattern = r'[a-z]+'
text = 'hello world'
matches = re.findall(pattern, text)
print(matches)  # ['hello', 'world']

# Без плюса
pattern = r'[a-z]'
matches = re.findall(pattern, text)
print(matches)  # ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']

Поиск чисел:

pattern = r'\d+'
text = 'My ID is 12345 and price is 99'
matches = re.findall(pattern, text)
print(matches)  # ['12345', '99']

# Без плюса
pattern = r'\d'
matches = re.findall(pattern, text)
print(matches)  # ['1', '2', '3', '4', '5', '9', '9']

Email адреса:

pattern = r'[a-z]+@[a-z]+\.[a-z]+'
text = 'Contact: john@example.com or admin@site.org'
matches = re.findall(pattern, text)
print(matches)  # ['john@example.com', 'admin@site.org']

# Объяснение:
# [a-z]+     — один или более букв (имя)
# @          — знак собачки
# [a-z]+     — один или более букв (домен)
# \.         — точка
# [a-z]+     — один или более букв (расширение)

Разница между ?, *, +

pattern_q = r'a?'   # 0 или 1
pattern_s = r'a*'   # 0 или больше
pattern_p = r'a+'   # 1 или больше

text = 'aaa'
print(re.search(pattern_q, text).group())  # 'a' (максимум 1)
print(re.search(pattern_s, text).group())  # 'aaa' (все, что можно)
print(re.search(pattern_p, text).group())  # 'aaa' (все, что можно)

text = ''
print(re.search(pattern_q, text) is not None)  # True (пустая строка подходит)
print(re.search(pattern_s, text) is not None)  # True (пустая строка подходит)
print(re.search(pattern_p, text) is not None)  # False (нужен хотя бы один)

Плюс в скобках (группы)

Плюс можно применить к группе символов:

pattern = r'(ab)+'
text = 'ababab'
match = re.search(pattern, text)
print(match.group())  # 'ababab' (группа 'ab' повторяется 3 раза)

pattern = r'(ab)+'
text = 'ab'
match = re.search(pattern, text)
print(match.group())  # 'ab' (группа повторяется 1 раз)

Реальный пример с URL параметрами:

pattern = r'(\w+=\w+&?)+'
text = 'id=123&name=john&active=true'
match = re.search(pattern, text)
print(match.group())  # 'id=123&name=john&active=true'

Нежадный плюс

Обычно плюс жадный — берет максимум. Чтобы сделать его нежадным, используй +?:

text = '<tag>content</tag>'

# Жадный
pattern = r'<.+>'
match = re.search(pattern, text)
print(match.group())  # '<tag>content</tag>' (весь текст от первой до последней скобки)

# Нежадный
pattern = r'<.+?>'
match = re.search(pattern, text)
print(match.group())  # '<tag>' (останавливается на первой закрывающей скобке)

Это важное различие при работе с HTML и XML!

Типичные ошибки

# Ошибка: забыли плюс, находит только одну букву
pattern = r'[a-z]'
text = 'hello'
print(re.findall(pattern, text))  # ['h', 'e', 'l', 'l', 'o']

# Правильно: с плюсом находит всё слово
pattern = r'[a-z]+'
print(re.findall(pattern, text))  # ['hello']

# Ошибка: звёздочка допускает пустую строку
pattern = r'^[0-9]*$'
re.match(pattern, '')  # Совпадает! (пустая строка валидна)

# Правильно: плюс требует хотя бы одну цифру
pattern = r'^[0-9]+$'
re.match(pattern, '')  # Не совпадает (нужна хотя бы одна цифра)

Когда использовать плюс

  • Поиск слов: \w+ — одно или более слово
  • Поиск чисел: \d+ — одно или более цифр
  • Поиск обязательных частей: если что-то ДОЛЖНО быть хотя бы один раз, используй +
  • Валидация: если поле не может быть пустым

Плюс — это один из самых частых квантификаторов в регулярных выражениях, используй его, когда что-то обязательно должно встречаться хотя бы один раз.