Dopasowywanie ciągów w języku Python bez złożonej składni RegEx

Dopasowywanie ciągów w języku Python bez złożonej składni RegEx

Węzeł źródłowy: 1935271

Dopasowywanie ciągów w języku Python bez złożonej składni RegEx
Zdjęcie autora
 

Mam związek miłości i nienawiści z wyrażeniami regularnymi (RegEx), szczególnie w Pythonie. Uwielbiam sposób wyodrębniania lub dopasowywania ciągów znaków bez pisania wielu funkcji logicznych. Jest nawet lepsza niż funkcja wyszukiwania ciągów. 

Nie podoba mi się to, że trudno mi nauczyć się i zrozumieć wzorce RegEx. Potrafię poradzić sobie z prostym dopasowywaniem ciągów, takim jak wyodrębnianie wszystkich znaków alfanumerycznych i czyszczenie tekstu na potrzeby zadań NLP. Sprawa staje się trudniejsza, jeśli chodzi o wyodrębnianie adresów IP, e-maili i identyfikatorów ze śmieciowych tekstów. Aby wyodrębnić wymagany element, musisz napisać złożony wzorzec RegEx String. 

Aby uprościć złożone zadania RegEx, poznamy prosty pakiet Pythona o nazwie pregeks. Ponadto przyjrzymy się także kilku przykładom wyodrębniania dat i wiadomości e-mail z długiego ciągu tekstu.  

Pregex to API wyższego poziomu zbudowane na bazie modułu `re`. Jest to RegEx bez skomplikowanych wzorców RegEx, które ułatwiają każdemu programiście zrozumienie i zapamiętanie wyrażeń regularnych. Co więcej, nie trzeba grupować wzorców ani uciekać przed metaznakami, a ponadto jest to modułowe. 

Możesz po prostu zainstalować bibliotekę za pomocą PIP.

pip install pregex

 

Aby przetestować potężną funkcjonalność PRegEx, użyjemy zmodyfikowanego przykładowego kodu z pliku dokumentacja

W poniższym przykładzie wyodrębniamy adres URL HTTP lub adres IPv4 z numerem portu. Nie musimy do tego tworzyć skomplikowanej logiki. Możemy skorzystać z wbudowanych funkcji `HttpUrl` i `IPv4`.

  1. Utwórz numer portu za pomocą AnyDigit(). Pierwsza cyfra portu nie powinna wynosić zero, a kolejne trzy cyfry mogą być dowolną liczbą. 
  2. Użyj opcji Albo(), aby dodać wiele logiki do wyodrębnienia, albo adres URL HTTP, albo adres IP z numerem portu. 
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
)

 

Będziemy używać długiego ciągu tekstowego ze znakami i opisami. 

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

 

Zanim wyodrębnimy pasujący ciąg, przyjrzyjmy się wzorowi RegEx. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Wydajność

Jak widać, ciężko jest przeczytać, a nawet zrozumieć, co się dzieje. To właśnie tutaj PREgEx błyszczy. Aby zapewnić przyjazny dla człowieka interfejs API do wykonywania złożonych zadań związanych z wyrażeniami regularnymi. 

(?: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}

 

Podobnie jak w przypadku `re.match`, użyjemy `.get_matches(text)` do wyodrębnienia wymaganego ciągu.

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

 

Wydajność

Wyodrębniliśmy zarówno adres IP z numerem portu, jak i dwa adresy internetowe. 

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

Przyjrzyjmy się kilku przykładom, w których możemy zrozumieć pełny potencjał PREgEx. 

W tym przykładzie wyodrębnimy pewne rodzaje wzorców dat z poniższego tekstu.

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

 

Używając Dokładnie() i AnyDigit(), utworzymy dzień, miesiąc i rok daty. Dzień i miesiąc mają dwie cyfry, a rok ma 4 cyfry. Są one oddzielone myślnikami „-”.

Po utworzeniu wzorca uruchomimy polecenie `get_match`, aby wyodrębnić pasujący ciąg. 

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)

 

Wydajność

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

 

Przyjrzyjmy się wzorowi RegEx za pomocą funkcji „get_pattern()”. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Wydajność

Jak widzimy, ma prostą składnię RegEx. 

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

Drugi przykład jest nieco skomplikowany i polega na wyodrębnieniu prawidłowych adresów e-mail ze śmieci. 

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

 

  • Stwórz użytkownik wzór z „OneOrMore()”. Użyjemy `AnyButFrom()`, aby usunąć „@” i spację z logiki. 
  • Podobny do a użytkownik wzór, który tworzymy a sukcesy firma wzór poprzez usunięcie dodatkowego znaku „.” od logiki.
  • Dla domena,  użyjemy funkcji `MatchAtLineEnd()`, aby rozpocząć wyszukiwanie od końca za pomocą dowolnych dwóch lub więcej znaków z wyjątkiem „@”, spacji i kropki.  
  • Połącz wszystkie trzy, aby stworzyć ostateczny wzór: użytkownik@firma.domena.
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)

 

Wydajność

Jak widzimy, PRegEx zidentyfikował dwa prawidłowe adresy e-mail. 

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

 

Uwaga: oba przykłady kodu są zmodyfikowanymi wersjami work by PyCoach

Jeśli jesteś analitykiem danych, analitykiem lub entuzjastą NLP, powinieneś użyć PRegEx do oczyszczenia tekstu i stworzenia prostej logiki. Zmniejszy to Twoją zależność od frameworków NLP, ponieważ większość dopasowań można wykonać za pomocą prostego API. 

W tym mini tutorialu poznaliśmy pakiet PRegEx w języku Python i jego przypadki użycia wraz z przykładami. Możesz dowiedzieć się więcej, czytając oficjalne informacje dokumentacja lub rozwiązanie a słowo problem z używaniem programowalnych wyrażeń regularnych.

 
 
Abid Ali Awan (@ 1abidaliawan) jest certyfikowanym specjalistą ds. analityków danych, który uwielbia tworzyć modele uczenia maszynowego. Obecnie koncentruje się na tworzeniu treści i pisaniu blogów technicznych na temat technologii uczenia maszynowego i data science. Abid posiada tytuł magistra zarządzania technologią oraz tytuł licencjata inżynierii telekomunikacyjnej. Jego wizją jest zbudowanie produktu AI z wykorzystaniem grafowej sieci neuronowej dla studentów zmagających się z chorobami psychicznymi.
 

Znak czasu:

Więcej z Knuggety