Ujemanje nizov Python brez zapletene sintakse RegEx

Ujemanje nizov Python brez zapletene sintakse RegEx

Izvorno vozlišče: 1935271

Ujemanje nizov Python brez zapletene sintakse RegEx
Slika avtorja
 

Z regularnimi izrazi (RegEx), zlasti v Pythonu, imam odnos ljubezni in sovraštva. Všeč mi je, kako lahko izvlečeš ali povežeš nize, ne da bi napisal več logičnih funkcij. Je celo boljša od funkcije iskanja nizov. 

Ni mi všeč, kako se težko naučim in razumem vzorce RegEx. Znam se ukvarjati s preprostim ujemanjem nizov, kot je ekstrahiranje vseh alfanumeričnih znakov in čiščenje besedila za NLP naloge. Stvari postanejo težje, ko gre za pridobivanje naslovov IP, e-pošte in ID-jev iz neželenega besedila. Za ekstrahiranje zahtevanega elementa morate napisati zapleten vzorec niza RegEx. 

Da bi zapletene naloge RegEx poenostavili, se bomo seznanili s preprostim paketom Python, imenovanim predizraz. Poleg tega si bomo ogledali tudi nekaj primerov pridobivanja datumov in e-poštnih sporočil iz dolgega niza besedila.  

Pregex je API višje ravni, zgrajen na vrhu modula `re`. Je RegEx brez zapletenih vzorcev RegEx, ki programerju olajša razumevanje in zapomnitev regularnih izrazov. Poleg tega vam ni treba združevati vzorcev ali ubežati metaznakov in je modularen. 

Knjižnico lahko preprosto namestite s PIP.

pip install pregex

 

Za preizkus zmogljive funkcionalnosti PRegExa bomo uporabili spremenjeno vzorčno kodo iz Dokumentacija

V spodnjem primeru ekstrahiramo URL HTTP ali naslov IPv4 s številko vrat. Za to nam ni treba ustvarjati zapletene logike. Uporabimo lahko vgrajeni funkciji `HttpUrl` in `IPv4`.

  1. Ustvarite številko vrat z AnyDigit(). Prva številka vrat ne sme biti nič, naslednje tri števke pa so lahko poljubne številke. 
  2. Uporabite Either(), če želite dodati več logik za ekstrahiranje, bodisi URL HTTP ali naslov IP s številko vrat. 
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
)

 

Uporabili bomo dolg niz besedila z znaki in opisi. 

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

 

Preden ekstrahiramo ujemajoči se niz, si poglejmo vzorec RegEx. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

izhod

Kot lahko vidimo, je težko prebrati ali celo razumeti, kaj se dogaja. Tukaj blesti PRegEx. Da vam zagotovimo človeku prijazen API za izvajanje kompleksnih nalog regularnih izrazov. 

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

 

Tako kot `re.match`, bomo uporabili `.get_matches(text)` za ekstrahiranje zahtevanega niza.

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

 

izhod

Izluščili smo naslov IP s številko vrat in dva spletna URL-ja. 

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

Oglejmo si nekaj primerov, kjer lahko razumemo celoten potencial PRegExa. 

V tem primeru bomo iz spodnjega besedila izvlekli določene vrste vzorcev datumov.

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

 

Z uporabo Exactly() in AnyDigit() bomo ustvarili dan, mesec in leto datuma. Dan in mesec imata dve števki, leto pa štiri števke. Ločeni so s pomišljaji »-«.

Ko ustvarimo vzorec, bomo zagnali `get_match`, da ekstrahiramo ujemajoči se niz. 

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)

 

izhod

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

 

Oglejmo si vzorec RegEx z uporabo funkcije `get_pattern()`. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

izhod

Kot lahko vidimo, ima preprosto sintakso RegEx. 

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

Drugi primer je nekoliko zapleten, kjer bomo iz neželenega besedila izluščili veljavne e-poštne naslove. 

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

 

  • Ustvarite uporabnik vzorec z `OneOrMore()`. Za odstranitev znaka »@« in presledka iz logike bomo uporabili `AnyButFrom()`. 
  • Podobno kot a uporabnik vzorec ustvarimo a podjetje vzorec z odstranitvijo dodatnega znaka ».« iz logike.
  • Za domena,  uporabili bomo `MatchAtLineEnd()` za začetek iskanja od konca s poljubnima dvema ali več znaki razen »@«, presledka in pike.  
  • Združite vse tri, da ustvarite končni vzorec: uporabnik@podjetje.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)

 

izhod

Kot lahko vidimo, je PRegEx identificiral dva veljavna e-poštna naslova. 

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

 

Opomba: oba primera kode sta spremenjeni različici dela avtorja PyCoach

Če ste podatkovni znanstvenik, analitik ali NLP navdušenec, bi morali uporabiti PRegEx za čiščenje besedila in ustvarjanje preproste logike. Zmanjšalo bo vašo odvisnost od ogrodij NLP, saj je večino ujemanja mogoče izvesti s preprostim API-jem. 

V tej mini vadnici smo spoznali paket Python PRegEx in njegove primere uporabe s primeri. Več lahko izveste tako, da preberete uradno Dokumentacija ali reševanje a uganka težava pri uporabi programabilnih regularnih izrazov.

 
 
Abid Ali Awan (@1abidaliawan) je certificiran strokovnjak za podatkovne znanstvenike, ki rad gradi modele strojnega učenja. Trenutno se osredotoča na ustvarjanje vsebin in pisanje tehničnih blogov o strojnem učenju in tehnologijah podatkovne znanosti. Abid ima magisterij iz tehnološkega managementa in diplomo iz telekomunikacijskega inženiringa. Njegova vizija je zgraditi izdelek AI z uporabo grafične nevronske mreže za študente, ki se borijo z duševnimi boleznimi.
 

Časovni žig:

Več od KDnuggets