Регулярные выражения (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-специалистов в Москве.



