Вместо этого создавайте читаемые выражения с помощью этой библиотеки.

Регулярные выражения — это строки/шаблоны, которые могут совпадать с входным текстом. Первоначально они были изобретены Стивеном Клини в 1950-х годах в лабораториях Белла, но теперь доступны в большинстве современных редакторов кода и языков программирования.

Регулярные выражения (также называемые RegEx) могут использоваться для различных целей. Например, распространенной задачей в информационном поиске (IR) является написание выражения, которое соответствует адресам электронной почты в фрагменте текста. В результате получается следующее выражение…

^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$reg

Учитывая этот пример, неудивительно, что регулярные выражения не имеют самой удобной кривой обучения в программировании. В результате коллективный вердикт по регулярным выражениям не вынесен. Некоторым программистам нравятся регулярные выражения из-за их универсальности и доступности для большинства языков/редакторов. Тем не менее, некоторые программисты разочарованы тем фактом, что каждый раз, когда вы хотите написать выражение, вам нужно обращаться к онлайн-конструктору регулярных выражений или Stack Overflow, даже для простых/общих задач.

Читаемые выражения

Для этой группы программистов доступно решение. А именно «читаемые выражения» (Redex). Redex — это альтернативный метод создания регулярных выражений. Он основан на двух простых элементах: логических операторах и встроенных функциях. Кроме того, чтобы улучшить кривую обучения и удобочитаемость, оба элемента должны быть похожи на простой английский.

Примеры

Если мы перепишем предыдущий пример (то есть создадим шаблон, который распознает адреса электронной почты) в Redex, мы получим следующее выражение. Обратите внимание, как — в отличие от предыдущего примера — он удобочитаем.

sequence:{*alpha,@,*alpha,.com} or sequence:{*alpha,@,*alpha,.co.uk}

Разберем этот пример. (Грубый) формат электронной почты — это что-то из алфавита, за которым следует символ «@» и хост/расширение. Это означает, что мы хотим иметь последовательность символов, которая придерживается этого порядка при поиске адресов электронной почты в тексте.

В нашем примере это реализовано с помощью оператора «последовательность», который является встроенной функцией Redex. Всего в Redex есть 7 таких встроенных функций, которые вы можете использовать для создания выражений. А именно, «начинается с», «заканчивается», «количество», «содержит», «местоположение» и «близость». Подробная информация об этих функциях и их использовании объясняется в документации Redex, которая доступна на GitHub (см. ссылку ниже).

Затем, поскольку мы не знаем точного содержания электронного письма, мы используем подстановочные знаки (также называемые «подстановочными знаками»). Для этого в Redex есть ряд встроенных опций. Однако, в отличие от регулярных выражений, форматирование подстановочных знаков очень похоже на английский язык.

Например, в предыдущем выражении мы использовали подстановочный знак для любого алфавита (который выражается как ‘*alpha’). Однако, если вместо этого вы хотите вернуть любое числовое значение, просто напишите ‘*num’. Все подстановочные знаки соответствуют этому формату. Всего Redex поддерживает 8 типов подстановочных знаков. Однако вы можете добавить собственные подстановочные знаки, если хотите.

Использование редекса

В настоящее время Redex доступен в Python через библиотеку python-redex. Чтобы начать использовать эту библиотеку, просто установите ее с помощью установщика пакетов Python.

pip3 install python-redex

После установки вы можете импортировать его с помощью следующей команды.

import redex as rd

Затем вы можете выполнить запрос Redex для строки, используя одно из трех доступных действий: has (возвращает логическое значение), find (возвращает список) и count (возвращает целое число). Более того, в этих функциях также можно задать ряд параметров. В частности, степень детализации поиска (например, возвращаемые слова/предложения/абзацы), разделительный символ (значение по умолчанию — пробел) и количество потоков.

Обратите внимание, что количество потоков относится к многопоточному программированию. Правильная установка этого параметра может сделать Redex более быстрым и масштабируемым, чем регулярные выражения. Однако этот параметр также требует некоторых знаний о вашем процессоре (ядрах/потоках) и оперативной памяти. Поэтому обычно остается значение по умолчанию.

Например, предположим, что у нас есть следующая строка, в которой мы хотим выполнить поиск: «это еще один тест для Rdx». И из этой строки мы хотим извлечь все не стоп-слова, проверив длину и использование заглавных букв в словах (что является обычной задачей при обработке естественного языка).

Для этого мы можем объединить две встроенные функции. Во-первых, count может проверять длину слов (поскольку стоп-слова обычно короче трех символов). Во-вторых, «startwith» может проверять использование заглавных букв в словах (поскольку стоп-слова обычно не пишутся с заглавной буквы).

Наконец, поскольку должно быть выполнено только одно условие, мы объединяем их с помощью оператора «или». Это приведет к следующему выражению Redex. Обратите внимание, что слова должны состоять как минимум из 4 символов или начинаться с прописной буквы.

rd.find("count:{*alpha,4} or startswith:*upper", string)

Вывод этого запроса отформатирован как список (потому что мы использовали функцию «найти»). Однако мы также можем выполнить этот запрос, используя функции «count» или «has», если нам нужны логические/целочисленные возвращаемые значения.

['another', 'test', 'Rdx']

В заключение

Цель этой статьи — ознакомить новичков с возможностями Redex. Для тех, кто хочет узнать больше о Redex, полная документация/демонстрация доступна на GitHub. Спасибо, что прочитали эту статью.