Регулярные выражения в Python

Регулярные выражения в Python

Эта статья объясняет регулярные выражения в Python.

Мы рассмотрим широкий спектр тем, от базового использования модуля re до сложного сопоставления шаблонов регулярных выражений.

YouTube Video

Регулярные выражения в Python

Модуль re используется для поиска и обработки строк с использованием регулярных выражений.

Что такое модуль re?

Модуль re включен в стандартную библиотеку Python и предоставляет функционал для обработки строк с использованием регулярных выражений. Регулярные выражения используются для эффективного поиска, извлечения или замены определённых шаблонов строк.

Основные шаблоны регулярных выражений

Регулярные выражения определяют шаблоны с использованием специальных символов. Ниже приведены некоторые основные шаблоны.

  • .: Любой одиночный символ
  • ^: Начало строки
  • $: Конец строки
  • \d: Любая цифра (0-9)
  • \w: Любой символ слова (a-z, A-Z, 0-9, _)
  • \s: Любой пробельный символ
  • *: Ноль или более повторений
  • +: Один или более повторений
  • []: Класс символов (например, [a-z] соответствует строчным буквам)
 1import re
 2
 3pattern = r"\d{3}-\d{4}"
 4text = "My postal code is 123-4567."
 5result = re.search(pattern, text)
 6if result:
 7    print(result.group())  # Output: 123-4567
 8
 9# Define a pattern using basic regular expression symbols
10pattern = r"^\w+\s\d+\s[a-zA-Z]+$"
11
12# Example text to test the pattern
13text = "Room 23 Tokyo"
14
15# Check if the pattern matches the text
16result = re.match(pattern, text)
17if result:
18    print("Matched:", result.group())
19else:
20    print("No match")
  • Этот код сначала проверяет, соответствует ли строка шаблону почтового индекса. Затем он проверяет, соответствует ли вся строка (от начала до конца) шаблону, состоящему из слова, пробельного символа, цифр, пробельного символа и английского слова. Это помогает понять, как можно комбинировать основные элементы регулярных выражений.

Как использовать функции сопоставления

re.match()

re.match() проверяет, соответствует ли начало строки указанному шаблону.

1import re
2
3pattern = r"\w+"
4text = "Python is powerful"
5match = re.match(pattern, text)
6if match:
7    print(match.group())  # Output: Python
  • Этот код проверяет, начинается ли строка с символа слова (буквенно-цифрового символа или символа подчёркивания). Первое слово 'Python' соответствует шаблону и выводится.

re.search()

re.search() просматривает всю строку и возвращает первое совпадение.

1import re
2
3pattern = r"powerful"
4text = "Python is powerful and versatile"
5search = re.search(pattern, text)
6if search:
7    print(search.group())  # Output: powerful
  • Этот код ищет по всей строке слово 'powerful' и возвращает первое совпадение. В результате re.search() возвращает найденную строку 'powerful'.

re.findall()

re.findall() возвращает все совпадения шаблона в виде списка.

1import re
2
3pattern = r"\b\w{6}\b"
4text = "Python is powerful and versatile"
5matches = re.findall(pattern, text)
6print(matches)  # Output: ['Python', 'strong']
  • Этот код находит все слова ровно из шести символов и возвращает их в виде списка. 'Python' в строке удовлетворяет условию, и возвращается список ['Python'].

re.finditer()

re.finditer() возвращает все совпадения в виде итератора, что позволяет получить детализированную информацию о каждом совпадении.

1import re
2
3pattern = r"\b\w{6}\b"
4text = "Python is powerful and versatile"
5matches = re.finditer(pattern, text)
6for match in matches:
7    print(match.group())  # Output: Python
  • Этот код последовательно ищет все шестибуквенные слова и обрабатывает каждое совпадение с помощью итератора. 'Python' здесь соответствует шаблону и выводится.

Замена и Разделение

re.sub()

re.sub() заменяет части строки, соответствующие регулярному выражению, на другую строку.

1import re
2
3pattern = r"\d+"
4text = "There are 100 apples"
5new_text = re.sub(pattern, "many", text)
6print(new_text)  # Output: There are many apples
  • Этот код заменяет все цифры в строке на 'many'.

re.split()

re.split() разделяет строку в местах, соответствующих регулярному выражению.

1import re
2
3pattern = r"\s+"
4text = "Python is powerful"
5parts = re.split(pattern, text)
6print(parts)  # Output: ['Python', 'is', 'powerful']
  • Этот код разделяет строку по одному или нескольким пробельным символам. В результате строка разбивается на слова, получается список ['Python', 'is', 'powerful'].

Группы и Захваты

Использование группировки в регулярных выражениях позволяет легко извлекать совпавшие подстроки. Заключение в скобки () захватывает это как группу.

1import re
2
3pattern = r"(\d{3})-(\d{4})"
4text = "My postal code is 123-4567."
5match = re.search(pattern, text)
6if match:
7    print(match.group(1))  # Output: 123
8    print(match.group(2))  # Output: 4567
  • Этот код извлекает из почтового индекса вида '123-4567' 3- и 4-значные числа как отдельные группы. group(1) возвращает первые три цифры '123', а group(2) — последние четыре цифры '4567'.

Именованные группы

Использование именованных групп позволяет получать значения по осмысленным именам, а не по индексам. Ниже приведён конкретный пример, который извлекает дату и уровень из лога.

1import re
2
3log = "2025-10-25 14:00:01 [ERROR] Something failed"
4
5pattern = r"(?P<date>\d{4}-\d{2}-\d{2}) (?P<time>\d{2}:\d{2}:\d{2}) \[(?P<level>[A-Z]+)\] (?P<msg>.*)"
6m = re.search(pattern, log)
7if m:
8    print(m.group("date"), m.group("time"), m.group("level"))
9    print("message:", m.group("msg"))
  • Этот код использует именованные группы, чтобы извлечь дату, время, уровень и сообщение из строки лога. Значения извлекаются по осмысленным именам, а не по индексам.

Использование Флагов Опций

Модуль re имеет несколько флагов для управления поведением поиска.

  • re.IGNORECASE (re.I): Флаг, который делает совпадение нечувствительным к регистру.
  • re.MULTILINE (re.M): Флаг, который позволяет находить совпадения между несколькими строками.
  • re.DOTALL (re.S): Флаг, при котором точка . также совпадает с символами новой строки.
1import re
2
3pattern = r"python"
4text = "Python is powerful"
5match = re.search(pattern, text, re.IGNORECASE)
6if match:
7    print(match.group())  # Output: Python
  • Этот код ищет слово 'python' без учёта регистра. Благодаря флагу re.IGNORECASE совпадением также считается 'Python'.

Преимущества объектов регулярных выражений (re.compile)

Компиляция шаблона с помощью re.compile делает его повторное использование более эффективным и улучшает читаемость. Здесь также можно задавать флаги.

В следующем примере многократно ищутся совпадения в нескольких строках с использованием скомпилированного шаблона. Если вы часто используете один и тот же шаблон, компиляция через re.compile повысит производительность.

1import re
2
3pattern = re.compile(r"User: (\w+), ID: (\d+)")
4text = "User: alice, ID: 1\nUser: bob, ID: 2"
5
6for m in pattern.finditer(text):
7    print(m.groups())
  • Этот код использует скомпилированное регулярное выражение для извлечения имён пользователей и идентификаторов из нескольких строк. re.compile повышает эффективность при повторном использовании одного и того же шаблона и делает код более читаемым.

Применения

Например, рассмотрите скрипт, который извлекает все адреса электронной почты из текстового файла.

1import re
2
3pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
4text = "Contact us at info@example.com or support@service.com."
5emails = re.findall(pattern, text)
6print(emails)  # Output: ['info@example.com', 'support@service.com']
  • Этот код находит все адреса электронной почты в строке и извлекает их в виде списка.

Заключение

Модуль re — это мощный инструмент для обработки строк в Python. Здесь мы рассмотрели широкий спектр — от базового использования до продвинутых регулярных выражений с использованием группировки и флагов. Регулярные выражения в Python очень мощные и являются незаменимым инструментом для обработки текста.

Вы можете следовать этой статье, используя Visual Studio Code на нашем YouTube-канале. Пожалуйста, также посмотрите наш YouTube-канал.

YouTube Video