Данный материал продолжает собой цикл статей, посвященный регулярным выражениям. Ниже, на конкретных примерах, рассматривается вопрос о том, как и зачем можно использовать регулярные выражения в Python. Конечно, стоит сразу оговориться, что данная статья, как следует из названия, затрагивает основы использования регулярок в питоне и не претендует на всеобъемлющий характер.
Данную статью можно условно разделить на 3 части:
- В первой части данной статьи содержится небольшая справка о функциях модуля re, которые используются наиболее часто.
- Далее приведена табличка с метасимволами, используемыми в шаблонах регулярных выражений
- И далее, в «практической» части, можно найти примеры использования некоторых функций регулярок в питоне
Модуль 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 и о том, как их использовать. Тем более, что в данном языке, по мнению автора, наиболее легкий для понимания синтаксис использования регулярок. Очевидно, что многие вещи, связанные с регулярными выражениями, остались за бортом, поэтому для дальнейшего погружения в тему регулярных выражений, лучше всего будет обратиться к официальной документации.