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

Данный материал продолжает собой цикл статей, посвященный регулярным выражениям. Ниже, на конкретных примерах, рассматривается вопрос о том, как и зачем можно использовать регулярные выражения в Python. Конечно, стоит сразу оговориться, что данная статья, как следует из названия, затрагивает основы использования регулярок в питоне и не претендует на всеобъемлющий характер.

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

Данную статью можно условно разделить на 3 части:

  1. В первой части данной статьи содержится небольшая справка о функциях модуля re, которые используются наиболее часто.
  2. Далее приведена табличка с метасимволами, используемыми в шаблонах регулярных выражений
  3. И далее, в «практической» части, можно найти примеры использования некоторых функций регулярок в питоне

Модуль re и его основные функции

Для того, чтобы воспользоваться возможностями регулярных выражений в python, нужно выполнить импорт модуля, который используется для работы с регулярными выражениями:

import re

Данный модуль поддерживает достаточно большой набор функций для решения прикладных задач. Вот основные используемые:

re.match(pattern, string)

Данная функция ищет соответствие регулярному выражению pattern в начале строки string. Возвращает либо объект сопоставления, либо None если не удалось ничего найти.

re.search(pattern, string)

Данная функция ищет первое совпадение с шаблоном pattern в строке string.
Аналогично предыдущей функции, возвращает объект сопоставления или None.

re.findall(pattern, string)

С помощью этой функции можно получить список всех непересекающихся совпадений с шаблоном pattern в строке string. Каждое совпадение представлено в виде строки.

re.split(pattern, string)

Используя данную функцию можно разбить строку string по шаблону pattern.
Результатом будет список строк, полученных в результате разделения.

re.sub(pattern, repl, string)

Заменяет все совпадения с шаблоном pattern в строке string на repl.
В результате возвращает новую строку.

re.escape(string)

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

re.fullmatch(pattern, string)

С помощью данной функции можно выполнить проверку, соответствует ли вся строка string регулярному выражению pattern. Возвращает объект сопоставления или None.

 

Таблица метасимволов для поиска по регулярным выражениям

 

Метасимвол Описание
. Соответствует любому символу, кроме символа новой строки (\n).
^ Соответствует началу строки.
$ Соответствует концу строки.
* Соответствует 0 или более повторений предыдущего символа или группы.
+ Соответствует 1 или более повторений предыдущего символа или группы.
? Соответствует 0 или 1 повторению предыдущего символа или группы.
{n} Соответствует ровно n повторениям предыдущего символа или группы.
{n,} Соответствует n или более повторениям предыдущего символа или группы.
{n,m} Соответствует от n до m повторений предыдущего символа или группы.
[] Соответствует любому символу из указанных в скобках. Например, [abc] соответствует a, b или c.
[^] Соответствует любому символу, не указанному в скобках. Например, [^abc] соответствует любому символу, кроме a, b и c.
\d Соответствует любой цифре, эквивалентно [0-9].
\D Соответствует любому символу, который не является цифрой, эквивалентно [^0-9].
\w Соответствует любой буквенно-цифровой символ или символ подчеркивания, эквивалентно [A-Za-z0-9_].
\W Соответствует любому символу, который не является буквенно-цифровым или символом подчеркивания, эквивалентно [^A-Za-z0-9_].
\s Соответствует любому пробельному символу, включая пробел, табуляцию и перенос строки.
\S Соответствует любому непробельному символу.
() Группирует символы или выражения в единый элемент, также используется для захвата совпадений.
(?:…) Группирует символы без захвата совпадений.
(?P<name>…) Группирует символы и присваивает совпадению имя, что позволяет ссылаться на него по имени в шаблоне.

Примеры использования регулярных выражений в Python

Функция re.match

Ниже можно найти несколько примеров практического использования функции re.match.

1. Проверка на предмет того, является ли строка корректным email-адресом.

import re

email = "example@domain.com"
pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'

if re.match(pattern, email):
   print("Введенный email валиден.")
else:
   print("Введенный email не валиден.")

2. Проверка на то, что строка содержит только заглавные буквы:

import re

text = "HELLO"
pattern = r'^[A-Z]+$'

if re.match(pattern, text):
   print("Строка содержит только заглавные буквы.")
else:
   print("Строка содержит не только заглавные буквы.")

3. Проверка на то, что строка содержит только буквы:

import re

text = "Буквы"
pattern = r'^[A-Za-zА-Яа-яЁё]+$'

if re.match(pattern, text):
   print("Строка содержит только буквы.")
else:
   print("Строка содержит не только буквы.")

4. Проверка на соответствие ip-адресу:

import re

ip_address = "192.168.1.1"
pattern = r'^(\d{1,3}\.){3}\d{1,3}$'

#pattern = r'^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$' 

if re.match(pattern, ip_address): 
   print("Строка соответствует шаблону IP-адреса.") 
else: 
   print("Строка не соответствует шаблону IP-адреса.")

Кажется, что тут требуется небольшое пояснение к примеру: Первый паттерн, что не под комментарием достаточно простой и позволяет проверить строку на соответствие формату ip-адреса. Однако, второй паттерн более полно отвечает поставленной задаче, так как проверяет, что каждая часть адреса находится в диапазоне от 0 до 255.

Функция re.search

Функцию re.search можно, например, использовать следующим образом:

import re
text = "Дата: 2024-08-23"
match = re.search(r'(\d{4})-(\d{2})-(\d{2})', text)
if match:
   year, month, day = match.groups()
   print(f"Год: {year}, Месяц: {month}, День: {day}")

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

Функция re.findall

Функция re.findall, как было сказано выше, выполняет поиск совпадений в строке. Например, ниже мы ищем цифры во входной строке и выводим их:

import re

text = "В 2023 году было продано 150 книг на сумму 150 т.р."

matches = re.findall(r'\d+', text)

print(matches)

Функция re.sub

В данном примере, с помощью функции re.sub, мы принимаем во входную строку номер карты и заменяем все цифровые символы на символ звездочки:

import re

text = "Мой номер карты: 1234 5670 9012 3456."
new_text = re.sub(r'\d', '*', text)
print(new_text)

Функция re.split

В данном примере, с помощью функции re.split, мы разбиваем строку по пробелам и знакам препинания:

import re

text = "Привет, как дела? Все хорошо!"
words = re.split(r'\W+', text)
print(words)

На этом данная обзорная статья подходит к концу. Кажется, что приведенные выше примеры дают представление о том, как работают регулярные выражения в python и о том, как их использовать. Тем более, что в данном языке, по мнению автора, наиболее легкий для понимания синтаксис использования регулярок. Очевидно, что многие вещи, связанные с регулярными выражениями, остались за бортом, поэтому для дальнейшего погружения в тему регулярных выражений, лучше всего будет обратиться к официальной документации.