match, search, findall, finditer, sub, split, compile
Модуль
reпредоставляет набор функций для работы с регулярными выражениями. Понимание каждого метода критично для эффективного использования regex.
re.match() ищет совпадение только в начале строки:
import re
# Успешное совпадение в начале
re.match(r'Hello', 'Hello world') # <re.Match object>
# Не найдёт, если паттерн не в начале
re.match(r'world', 'Hello world') # None
# Эквивалентно паттерну с ^
re.match(r'pattern', string) # То же, что re.search(r'^pattern', string)match = re.match(r'(\d+)', '123abc')
if match:
match.group() # '123' — полное совпадение
match.groups() # ('123',) — захваченные группы
match.start() # 0 — начало совпадения
match.end() # 3 — конец совпадения
match.span() # (0, 3) — кортеж (start, end)
else:
print('No match')re.search() ищет первое совпадение в любом месте строки:
# Ищет по всей строке
re.search(r'world', 'Hello world') # <re.Match object>
# Находит первое совпадение
re.search(r'\d+', 'abc123def456') # '123' — первое число# match() — только начало
re.match(r'\d+', 'abc123') # None
re.match(r'\d+', '123abc') # '123'
# search() — везде
re.search(r'\d+', 'abc123') # '123'
re.search(r'\d+', '123abc') # '123're.findall() возвращает список всех совпадений:
# Без групп — список строк
re.findall(r'\d+', 'a1b23c456') # ['1', '23', '456']
# С группами — список кортежей
re.findall(r'(\d+)-(\d+)', '1-2 3-4') # [('1', '2'), ('3', '4')]
# С именованными группами — тоже кортежи
re.findall(r'(?P<a>\d+)-(?P<b>\d+)', '1-2') # [('1', '2')]# * можетсоответствует пустую строку
re.findall(r'a*', 'bbb') # ['', '', '', ''] — 4 пустых совпадения
# Используйте + для непустых
re.findall(r'a+', 'bbb') # []re.finditer() возвращает итератор объектов Match:
text = 'abc123def456'
for match in re.finditer(r'\d+', text):
print(f'{match.group()} at {match.span()}')
# 123 at (3, 6)
# 456 at (9, 12)# findall() — создаёт весь список в памяти
matches = re.findall(r'\d+', large_text)
# finditer() — ленивая итерация, экономит память
for match in re.finditer(r'\d+', large_text):
process(match.group())re.sub() заменяет совпадения на строку или результат функции:
# Простая замена
re.sub(r'\d+', 'X', 'abc123def456') # 'abcXdefX'
# Замена с backreferences
re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\3.\2.\1', '2024-03-09')
# '09.03.2024'
# С именованными группами
re.sub(r'(?P<y>\d{4})-(?P<m>\d{2})-(?P<d>\d{2})',
r'\g<d>.\g<m>.\g<y>', '2024-03-09')def upper_match(match):
return match.group().upper()
re.sub(r'\w+', upper_match, 'hello world') # 'HELLO WORLD'
# С группами
def swap_names(match):
first, last = match.groups()
return f'{last}, {first}'
re.sub(r'(\w+) (\w+)', swap_names, 'John Doe') # 'Doe, John'# Заменить только первые 2 совпадения
re.sub(r'\d+', 'X', '1 2 3 4 5', count=2) # 'X X 3 4 5're.split() разбивает строку по паттерну:
# Разбиение по пробелам
re.split(r'\s+', 'one two three') # ['one', 'two', 'three']
# Разбиение по нескольким разделителям
re.split(r'[,\s;]+', 'one, two; three four') # ['one', 'two', 'three', 'four']
# Разбиение по цифрам
re.split(r'\d+', 'abc123def456ghi') # ['abc', 'def', 'ghi']# С захватывающей группой — разделители включаются
re.split(r'(\d+)', 'abc123def456') # ['abc', '123', 'def', '456', 'ghi']
# С non-capturing группой — разделители не включаются
re.split(r'(?:\d+)', 'abc123def456') # ['abc', 'def', 'ghi']# Максимум 2 разбиения
re.split(r'\s+', 'one two three four', maxsplit=2) # ['one', 'two', 'three four']re.compile() создаёт объект Pattern для повторного использования:
# Компиляция
pattern = re.compile(r'\d+')
# Использование
pattern.search('abc123') # <re.Match object>
pattern.findall('a1b23c456') # ['1', '23', '456']
pattern.sub('X', 'abc123def') # 'abcXdef'# Без компиляции — компиляция при каждом вызове
for text in texts:
re.search(r'\d+', text)
# С компиляцией — компиляция один раз
pattern = re.compile(r'\d+')
for text in texts:
pattern.search(text)pattern = re.compile(r'hello', re.IGNORECASE | re.MULTILINE)
pattern.search('HELLO') # Найдёт
pattern.search('hello') # НайдётОбъект Match, возвращаемый match(), search(), finditer(), имеет методы:
match = re.search(r'(\d+)-(\d+)', '123-456')
match.group() # '123-456' — полное совпадение
match.group(0) # '123-456' — то же
match.group(1) # '123' — первая группа
match.group(2) # '456' — вторая группа
match.groups() # ('123', '456') — все группы
match.groupdict() # {} — словарь именованных групп
match.start() # 0 — начало совпадения
match.end() # 7 — конец совпадения
match.span() # (0, 7) — (start, end)
match.re # Скомпилированный паттерн
match.string # Исходная строкаmatch = re.search(r'(?P<a>\d+)-(?P<b>\d+)', '123-456')
match.group('a') # '123'
match.group('b') # '456'
match.groupdict() # {'a': '123', 'b': '456'}def is_valid_email(email):
pattern = r'^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,}$'
return bool(re.match(pattern, email))
is_valid_email('user@example.com') # True
is_valid_email('invalid') # Falsedef extract_links(html):
pattern = r'<a\s+href="([^"]+)">'
return re.findall(pattern, html)
extract_links('<a href="url1">Link1</a><a href="url2">Link2</a>')
# ['url1', 'url2']def normalize_spaces(text):
return re.sub(r'\s+', ' ', text.strip())
normalize_spaces(' hello world ') # 'hello world'def parse_log_line(line):
pattern = r'(?P<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (?P<level>\w+) (?P<message>.+)'
match = re.match(pattern, line)
if match:
return match.groupdict()
return None
parse_log_line('2024-03-09 14:30:15 ERROR Database connection failed')
# {'timestamp': '2024-03-09 14:30:15', 'level': 'ERROR', 'message': 'Database connection failed'}# Ошибка: match() ищет только в начале
re.match(r'\d+', 'abc123') # None
# Правильно: search() ищет везде
re.search(r'\d+', 'abc123') # '123'# Ошибка: вызов group() на None
match = re.match(r'\d+', 'abc')
match.group() # AttributeError
# Правильно: проверка на None
match = re.match(r'\d+', 'abc')
if match:
print(match.group())# Ошибка: ожидали полные совпадения
re.findall(r'(\d+)-(\d+)', '1-2 3-4') # [('1', '2'), ('3', '4')]
# Правильно: non-capturing группы
re.findall(r'(?:\d+)-(?:\d+)', '1-2 3-4') # ['1-2', '3-4']re.match() — поиск только в начале строкиre.search() — поиск первого совпадения вездеre.findall() — список всех совпадений (кортежи при группах)re.finditer() — итератор объектов Match (экономит память)re.sub() — замена с поддержкой backreferences и функцийre.split() — разбиение по паттернуre.compile() — компиляция для повторного использованияgroup(), groups(), groupdict(), start(), end(), span()Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.