Регулярные выражения (regular expressions) являются важнейшим инструментом для многих задач NLP в Python. Сегодня мы расскажем об основных функциях Python-модуля re. Читайте в этой статье: как с помощью регулярных выражений найти нужные символы, как посчитать количество вхождений, а также как заменить одну подстроку на другую в Python
Зачем нужны регулярные выражения
Регулярные выражения — последовательность символов, которая определяет шаблон поиска. Например, для задач NLP это может быть поиск именованных сущностей (для такой задачи может подойти Python-библиотека Yargy). Представим себе выражение:
Python is cool
Требуется извлечь из него слово «cool». Казалось бы, сделать это очень просто, достаточно передать это слово в Python-функцию с регулярным выражением. Но поскольку это набор символов, то выражения, которые содержат этот набор также сработают:
Python is coolest I have a watercooler Python is supercool
Регулярные выражения в Python
Для работы с регулярными выражениями в Python используется модуль re
(сокращено от regular expression). В нем содержится 4 основные функции: search
, match
, findall
, finditer
, а также sub
Причём у первых 4-х одинаковая сигнатура — принимают на вход шаблон и выражение. Обращаясь к предыдущему примеру, шаблоном является «cool». Функция sub
дополнительно принимает на вход строку для замены.
Ищем первый попавшийся шаблон с search
Функция search
найдёт в выражении первый попавшийся шаблон. Нам нужно найти шаблон, который состоит из последовательности символов c, o, o, l. Поэтому передаём в функцию этот шаблон и выражение. Такое регулярное выражение в Python выглядит следующим образом:
>>> import re >>> expr = 'Python is cool' >>> pattern = 'cool' >>> re.search(pattern, expr) <re.Match object; span=(10, 14), match='cool'>
Мы получили объект Match, а span
показывает индексы шаблона в выражении. Поэтому его так же можно извлечь в Python:
>>> expr[10:14] 'cool'
Заметим, что функция search
находит только первый попавшийся шаблон, дальше она уже не смотрит:
>>> expr = 'Python is cool, very cool' >>> re.search(pattern, expr) <re.Match object; span=(10, 14), match='cool'>
Также не забываем, что шаблон — это последовательность символов, а не само слово. Например, ниже показано, как в Python находится последовательность «cool» в составном слове.
>>> expr = 'I have a watercooler' >>> re.search('cool', expr) <re.Match object; span=(14, 18), match='cool'>
Ищем все вхождения с findall и finditer
В отличие от функции search
, две других findall
и finditer
вернут все найденные вхождения. Отличаются findall
и finditer
друг от друга тем, что первый возвращает список (list), а второй итератор (iterator), о котором говорили тут. Возвращаясь к предыдущему примеру, регулярное выражение для нахождения всех совпадений в Python будет выглядеть так:
>>> expr = 'Python is cool, very cool' >>> re.findall('cool', expr) ['cool', 'cool'] >>> re.finditer('cool', expr) <callable_iterator object at 0x7fe095db00d0>
С помощью функции findall
можно посчитать количество шаблонов во всей строке:
>>> len(re.findall('cool', expr)) 2
Проверяем начало строки с match
Функция match
проверит начало строки на содержание шаблона. Пример выше не начинается с cool, поэтому эта функция вернёт None
. С другой стороны, если выражение начинается с шаблона, то функция match
вернёт объект Match. Рассмотрите следующие регулярные выражения в Python:
>>> expr = 'Python is cool' >>> re.match('Python', expr) <re.Match object; span=(0, 6), match='Python'> >>> re.match('cool', expr) is None True
Исключаем шаблон из строки с sub
Ещё одной полезной функцией Python-модуля re является sub
. Она необходима, когда один шаблон нужно заменить на другой и пригодится для подготовки текстов перед применением NLP-методов в Python, например, для избавления от всех цифр, знаков препинания и символов. К сигнатуре этой функции добавляется аргумент repl
— на какую строку заменяем. Ниже регулярные выражения в Python это демонстрируют. Обратите внимание, что sub
возвращает строку, поэтому их стоит переприсвоить.
>>> expr = 'Python is cool, very cool' >>> pattern = 'cool' >>> repl = 'slow' >>> re.sub(pattern, repl, expr) 'Python is slow, very slow'
Также отметим, что функция заменяет все вхождения. Если требуется ограничить это число, то оно указывается в аргументе count
.
>>> re.sub(pattern, repl, expr, count=1) 'Python is slow, very cool'
Ещё больше подробностей о работе регулярных выражения в Python на реальных примерах Data Science задач, вы узнаете на нашем специализированном курсе «PNLP: NLP – обработка естественного языка с Python» в лицензированном учебном центре обучения и повышения квалификации Data Scientist’ов и IT-специалистов в Москве.