Сопоставление строк Python без сложного синтаксиса RegEx

Сопоставление строк Python без сложного синтаксиса RegEx

Исходный узел: 1935271

Сопоставление строк Python без сложного синтаксиса RegEx
Изображение по автору
 

У меня есть отношения любви и ненависти к регулярным выражениям (RegEx), особенно в Python. Мне нравится, как вы можете извлекать или сопоставлять строки без написания множества логических функций. Это даже лучше, чем функция поиска String. 

Что мне не нравится, так это то, как мне трудно изучать и понимать шаблоны RegEx. Я могу справиться с простым сопоставлением строк, таким как извлечение всех буквенно-цифровых символов и очистка текста для задач НЛП. Все становится сложнее, когда дело доходит до извлечения IP-адресов, электронных писем и идентификаторов из нежелательного текста. Вы должны написать сложный шаблон RegEx String, чтобы извлечь требуемый элемент. 

Чтобы упростить сложные задачи RegEx, мы узнаем о простом пакете Python, называемом предварительное выражение. Кроме того, мы также рассмотрим несколько примеров извлечения дат и электронных писем из длинной строки текста.  

Предварительное выражение — это высокоуровневый API, построенный поверх модуля `re`. Это RegEx без сложных шаблонов RegEx, что позволяет любому программисту легко понять и запомнить регулярные выражения. Кроме того, вам не нужно группировать шаблоны или экранировать метасимволы, и это модульно. 

Вы можете просто установить библиотеку с помощью PIP.

pip install pregex

 

Чтобы протестировать мощную функциональность PRegEx, мы будем использовать модифицированный пример кода из документации

В приведенном ниже примере мы извлекаем URL-адрес HTTP или адрес IPv4 с номером порта. Нам не нужно создавать для этого сложную логику. Мы можем использовать встроенные функции HttpUrl и IPv4.

  1. Создайте номер порта, используя AnyDigit(). Первая цифра порта не должна быть нулем, а следующие три цифры могут быть любым числом. 
  2. Используйте Both(), чтобы добавить несколько логик для извлечения URL-адреса HTTP или IP-адреса с номером порта. 
from pregex.core.pre import Pregex
from pregex.core.classes import AnyDigit
from pregex.core.operators import Either
from pregex.meta.essentials import HttpUrl, IPv4 port_number = (AnyDigit() - '0') + 3 * AnyDigit() pre = Either( HttpUrl(capture_domain=True, is_extensible=True), IPv4(is_extensible=True) + ':' + port_number
)

 

Мы будем использовать длинную строку текста с символами и описаниями. 

text = """IPV4--192.168.1.1:8000-- address--https://www.abid.works-- website--https://kdnuggets.com--text"""

 

Прежде чем мы извлечем совпадающую строку, давайте посмотрим на шаблон RegEx. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Результат

Как мы видим, трудно прочитать или даже понять, что происходит. Вот где сияет PRegEx. Чтобы предоставить вам удобный API для выполнения сложных задач с регулярными выражениями. 

(?:https?://)?(?:www.)?(?:[a-zdA-Z][a-z-dA-Z]{,61}[a-zdA-Z].)*([a-zdA-Z][a-z-dA-Z]{,61}[a-zdA-Z]).[a-z]{2,6}(?::d{1,4})?(?:/[!-.0-~]+)*/?(?:(?=[!-/[-`{-~:-@])|(?=w))|(?:(?:d|[1-9]d|1d{2}|2(?:[0-4]d|5[0-5])).){3}(?:d|[1-9]d|1d{2}|2(?:[0-4]d|5[0-5])):[1-9]d{3}

 

Как и в случае с `re.match`, мы будем использовать `.get_matches(text)` для извлечения необходимой строки.

results = pre.get_matches(text)
print(results)

 

Результат

Мы извлекли как IP-адрес с номером порта, так и два веб-URL. 

['192.168.1.1:8000', 'https://www.abid.works', 'https://kdnuggets.com']

Давайте рассмотрим пару примеров, где мы можем понять весь потенциал PRegEx. 

В этом примере мы будем извлекать определенные типы шаблонов дат из текста ниже.

text = """ 04-15-2023 2023-08-15 06-20-2023 06/24/2023 """

 

Используя Exactly() и AnyDigit(), мы создадим день, месяц и год даты. День и месяц состоят из двух цифр, а год состоит из 4 цифр. Они разделены тире «-».

После создания шаблона мы запустим `get_match`, чтобы извлечь соответствующую строку. 

from pregex.core.classes import AnyDigit
from pregex.core.quantifiers import Exactly day_or_month = Exactly(AnyDigit(), 2) year = Exactly(AnyDigit(), 4) pre = ( day_or_month + "-" + day_or_month + "-" + year
) results = pre.get_matches(text)
print(results)

 

Результат

['04-15-2023', '06-20-2023']

 

Давайте посмотрим на шаблон RegEx, используя функцию `get_pattern()`. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Результат

Как мы видим, у него простой синтаксис RegEx. 

d{2}-d{2}-d{4}

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

text = """ user1@abid.works editorial@@kdnuggets.com lover@python.gg. editorial1@kdnuggets.com """

 

  • Создайте пользователь шаблон с `OneOrMore()`. Мы будем использовать `AnyButFrom()`, чтобы удалить «@» и пробел из логики. 
  • Подобно пользователь узор, который мы создаем Компания шаблон, удалив дополнительный символ «.» из логики.
  • Для того, чтобы получить домен,  мы будем использовать `MatchAtLineEnd()`, чтобы начать поиск с конца с любыми двумя или более символами, кроме «@», пробела и точки.  
  • Объедините все три, чтобы создать окончательный узор: пользователь@компания.домен.
from pregex.core.classes import AnyButFrom
from pregex.core.quantifiers import OneOrMore, AtLeast
from pregex.core.assertions import MatchAtLineEnd user = OneOrMore(AnyButFrom("@", ' '))
company = OneOrMore(AnyButFrom("@", ' ', '.'))
domain = MatchAtLineEnd(AtLeast(AnyButFrom("@", ' ', '.'), 2)) pre = ( user + "@" + company + '.' + domain
) results = pre.get_matches(text)
print(results)

 

Результат

Как мы видим, PRegEx определил два действительных адреса электронной почты. 

['user1@abid.works', 'editorial1@kdnuggets.com']

 

Примечание: оба примера кода являются модифицированными версиями работы PyCoach

Если вы специалист по данным, аналитик или энтузиаст НЛП, вам следует использовать PRegEx для очистки текста и создания простой логики. Это снизит вашу зависимость от фреймворков НЛП, поскольку большую часть сопоставления можно выполнить с помощью простого API. 

В этом мини-руководстве мы узнали о пакете Python PRegEx и его вариантах использования с примерами. Вы можете узнать больше, прочитав официальный документации или решение Wordline проблема с использованием программируемых регулярных выражений.

 
 
Абид Али Аван (@ 1abidaliawan) — сертифицированный специалист по анализу данных, который любит создавать модели машинного обучения. В настоящее время он занимается созданием контента и ведением технических блогов по технологиям машинного обучения и обработки данных. Абид имеет степень магистра в области управления технологиями и степень бакалавра в области телекоммуникаций. Его видение состоит в том, чтобы создать продукт искусственного интеллекта с использованием графовой нейронной сети для студентов, борющихся с психическими заболеваниями.
 

Отметка времени:

Больше от КДнаггетс