Модуль re: регулярные выражения в Python

автор рубрика ,
Модуль re: регулярные выражения в Python

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

Источники
  1. https://docs.python.org/3/howto/regex.html
Комментировать