Найти тему
10,1 тыс подписчиков

🗒 Регулярные выражения для задач NLP в Python. Часть1


Рассморим основные функции Python-модуля re.

Регулярные выражения - это набор символов, который определяет паттерн для поиска в тексте. Например, в задачах NLP можно использовать Python-библиотеку Yargy для поиска именованных сущностей. Но использование выражений может вызвать неоднозначность, так как выражения, содержащие искомый паттерн, также будут найдены.

В Python модуль re используется для работы с регулярными выражениями и содержит 4 основные функции: search, match, findall, finditer и sub.

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

re.search() – находит первое вхождение фрагмента в любом месте и возвращает объект match. Если в строке есть другие фрагменты, соответствующие запросу, re.search их проигнорирует.

import re
expr = 'i love Data Science'
pattern = 'love'
print(re.search(pattern, expr))

<re.Match object; span=(2, 6), match='love'>

Обратите внимание, что функция search находит только первый попавшийся шаблон, дальше она уже не смотрит:

expr = 'I love data science, i love @data_analysis_ml' print( re.search(pattern, expr))

<re.Match object; span=(2, 6), match='love'>

Нельзя забывать, что шаблон представляет собой последовательность символов, а не сами слова.
Например, как можно найти последовательность "love" в составном слове в Python, показано ниже.

expr = 'So many lovers
re.search('love', expr)

Как найти все вхождения при помощи findall и finditer.

В отличие от функции search, две другие функции findall и finditer найдут все вхождения. Разница между findall и finditer заключается в том, что первый возвращает список (list), а второй возвращает итератор (iterator), который мы обсудили ранее.

Возвращаясь к предыдущему примеру, регулярное выражение для обнаружения всех вхождений в Python будет иметь следующий вид:

expr = 'I love data science, I love @data_analysis_ml'

re.findall('love', expr)
['love', 'love']

re.finditer('love', expr)
<callable_iterator object at 0x7efd1caf6b60>

Проверяем начало строки с помощью функции match.
Функция match проверяет начало строки на соответствие шаблону.

Пример выше не начинается с "love", поэтому эта функция вернет значение None. С другой стороны, если выражение начинается с шаблона, функция match вернет объект Match. Рассмотрите следующие регулярные выражения в Python:

expr = 'i love Data Science'
re.match('Data', expr)
None

re.match('love', expr) is None
True

Исключаем шаблон из строки с sub

Ещё одной полезной функцией Python-модуля re является sub. Она необходима, когда один шаблон нужно заменить на другой и пригодится для подготовки текстов перед применением NLP-методов в Python, например, для избавления от всех цифр, знаков препинания и символов. К сигнатуре этой функции добавляется аргумент repl — на какую строку заменяем. Ниже регулярные выражения в Python это демонстрируют. Обратите внимание, что sub возвращает строку, поэтому их стоит переприсвоить.

expr = 'i love Data Science'
pattern = 'love'
repl = 'hate'
re.sub(pattern, repl, expr)
'i hate Data Science'

Также отметим, что функция заменяет все вхождения. Если требуется ограничить это число, то оно указывается в аргументе count.

re.sub(pattern, repl, expr, count=1)


2 минуты