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 минуты
12 июня 2023