Регулярные выражения в 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-канал.