Зіставлення рядків Python без складного синтаксису регулярних виразів

Зіставлення рядків Python без складного синтаксису регулярних виразів

Вихідний вузол: 1935271

Зіставлення рядків Python без складного синтаксису регулярних виразів
Зображення автора
 

До регулярних виразів (RegEx), особливо в Python, я ставлюся як «любов-ненависть». Мені подобається, як ви можете витягувати або зіставляти рядки без написання кількох логічних функцій. Це навіть краще, ніж функція пошуку рядків. 

Що мені не подобається, так це те, що мені важко вивчити та зрозуміти шаблони регулярних виразів. Я можу мати справу з простим зіставленням рядків, наприклад із виділенням усіх буквено-цифрових символів і очищенням тексту для завдань NLP. Справи стають складнішими, коли справа доходить до отримання IP-адрес, електронних листів та ідентифікаторів із небажаного тексту. Ви повинні написати складний шаблон RegEx String, щоб витягти необхідний елемент. 

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

Pregex це API вищого рівня, створений на основі модуля `re`. Це регулярний вираз без складних шаблонів регулярних виразів, який полегшує будь-якому програмісту розуміння та запам’ятовування регулярних виразів. Крім того, вам не потрібно групувати шаблони або екранувати метасимволи, і це модульно. 

Ви можете просто встановити бібліотеку за допомогою PIP.

pip install pregex

 

Щоб перевірити потужну функціональність PRegEx, ми використаємо модифікований приклад коду з документація

У прикладі нижче ми витягуємо URL-адресу HTTP або адресу IPv4 із номером порту. Нам не потрібно створювати для цього складну логіку. Ми можемо використовувати вбудовані функції `HttpUrl` і `IPv4`.

  1. Створіть номер порту за допомогою AnyDigit(). Перша цифра порту не повинна бути нулем, а наступні три цифри можуть бути будь-якими числами. 
  2. Використовуйте Either(), щоб додати кілька логік для вилучення, 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(), ми створимо день, місяць і рік дати. День і місяць мають дві цифри, а рік – чотири цифри. Вони розділені «-» тире.

Після створення шаблону ми запустимо 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()`, щоб видалити “@” і пробіл із логіки. 
  • Подібно до a користувач шаблон ми створюємо a компанія шаблон, видаливши додатковий символ «.» з логіки.
  • Для домен,  ми будемо використовувати `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

Якщо ви дослідник даних, аналітик або ентузіаст NLP, вам слід використовувати PRegEx, щоб очистити текст і створити просту логіку. Це зменшить вашу залежність від фреймворків NLP, оскільки більшість зіставлення можна виконати за допомогою простого API. 

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

 
 
Абід Алі Аван (@1abidaliawan) є сертифікованим фахівцем із дослідження даних, який любить створювати моделі машинного навчання. Зараз він зосереджується на створенні контенту та написанні технічних блогів про технології машинного навчання та науки про дані. Абід має ступінь магістра з управління технологіями та ступінь бакалавра в галузі телекомунікаційної інженерії. Його бачення полягає в тому, щоб створити продукт AI з використанням нейронної мережі графа для студентів, які борються з психічними захворюваннями.
 

Часова мітка:

Більше від KDnuggets