Python-strengmatching uden kompleks regex-syntaks

Python-strengmatching uden kompleks regex-syntaks

Kildeknude: 1935271

Python-strengmatching uden kompleks regex-syntaks
Billede af forfatter
 

Jeg har et had-og-kærlighedsforhold til regulære udtryk (RegEx), især i Python. Jeg elsker, hvordan du kan udtrække eller matche strenge uden at skrive flere logiske funktioner. Det er endnu bedre end String-søgefunktionen. 

Hvad jeg ikke kan lide er, hvordan det er svært for mig at lære og forstå RegEx-mønstre. Jeg kan håndtere simpel String-matching, såsom at udtrække alle alfanumeriske tegn og rense teksten for NLP-opgaver. Tingene bliver sværere, når det kommer til at udtrække IP-adresser, e-mails og ID'er fra uønsket tekst. Du skal skrive et komplekst RegEx-strengmønster for at udtrække det påkrævede element. 

For at gøre komplekse RegEx-opgaver enkle, vil vi lære om en simpel Python-pakke kaldet PeGex. Desuden vil vi også se på et par eksempler på udtrækning af datoer og e-mails fra en lang tekststreng.  

Pregex er et højere niveau API bygget oven på "re" modulet. Det er et RegEx uden komplekse RegEx-mønstre, der gør det nemt for enhver programmør at forstå og huske regulære udtryk. Desuden behøver du ikke gruppere mønstre eller undslippe metakarakterer, og det er modulært. 

Du kan blot installere biblioteket ved hjælp af PIP.

pip install pregex

 

For at teste den kraftfulde funktionalitet af PRegEx, vil vi bruge modificeret eksempelkode fra dokumentation

I eksemplet nedenfor udtrækker vi enten HTTP URL eller en IPv4-adresse med et portnummer. Vi behøver ikke skabe kompleks logik for det. Vi kan bruge indbyggede funktioner `HttpUrl` og `IPv4`.

  1. Opret et portnummer ved hjælp af AnyDigit(). Det første ciffer i porten skal ikke være nul, og de næste tre cifre kan være et hvilket som helst tal. 
  2. Brug enten() til at tilføje flere logikker, der skal udtrækkes, enten HTTP URL eller IP-adresse med et portnummer. 
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
)

 

Vi vil bruge en lang tekststreng med tegn og beskrivelser. 

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

 

Før vi udtrækker den matchende streng, lad os se på RegEx-mønsteret. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Produktion

Som vi kan se, er det svært at læse eller endda forstå, hvad der foregår. Det er her PRegEx skinner. For at give dig en menneskevenlig API til at udføre komplekse regulære udtryksopgaver. 

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

 

Ligesom `re.match`, vil vi bruge `.get_matches(text)` til at udtrække den påkrævede streng.

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

 

Produktion

Vi har udtrukket både IP-adressen med portnummer og to web-URL'er. 

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

Lad os se på et par eksempler, hvor vi kan forstå det fulde potentiale af PRegEx. 

I dette eksempel vil vi udtrække visse slags datomønstre fra teksten nedenfor.

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

 

Ved at bruge Exactly() og AnyDigit(), vil vi oprette dagen, måneden og året for datoen. Dagen og måneden har to cifre, mens året har 4 cifre. De er adskilt af "-" bindestreger.

Efter at have oprettet mønsteret, kører vi 'get_match' for at udtrække den matchende streng. 

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)

 

Produktion

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

 

Lad os se på RegEx-mønsteret ved at bruge funktionen `get_pattern()`. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Produktion

Som vi kan se, har den en simpel RegEx-syntaks. 

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

Det andet eksempel er lidt komplekst, hvor vi vil udtrække gyldige e-mailadresser fra uønsket tekst. 

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

 

  • Opret en bruger mønster med 'OneOrMore()'. Vi vil bruge `AnyButFrom()` til at fjerne "@" og mellemrum fra logikken. 
  • Ligner a bruger mønster vi skaber et selskab mønster ved at fjerne det ekstra tegn "." fra logikken.
  • For domæne,  vi vil bruge `MatchAtLineEnd()` til at starte søgningen fra slutningen med to eller flere tegn undtagen "@", mellemrum og punktum.  
  • Kombiner alle tre for at skabe det endelige mønster: bruger@virksomhed.domæne.
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)

 

Produktion

Som vi kan se, har PRegEx identificeret to gyldige e-mailadresser. 

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

 

Bemærk: begge kodeeksempler er modificerede versioner af arbejde af PyCoachen

Hvis du er dataforsker, analytiker eller NLP-entusiast, bør du bruge PRegEx til at rense teksten og skabe enkel logik. Det vil reducere din afhængighed af NLP-rammer, da det meste af matchningen kan udføres ved hjælp af simpel API. 

I denne mini-tutorial har vi lært om Python-pakken PRegEx og dens use cases med eksempler. Du kan lære mere ved at læse den officielle dokumentation eller løse en ordle problem med at bruge programmerbare regulære udtryk.

 
 
Abid Ali Awan (@1abidaliawan) er en certificeret dataforsker, der elsker at bygge maskinlæringsmodeller. I øjeblikket fokuserer han på indholdsskabelse og skriver tekniske blogs om maskinlæring og datavidenskabsteknologier. Abid har en kandidatgrad i teknologiledelse og en bachelorgrad i telekommunikationsingeniør. Hans vision er at bygge et AI-produkt ved hjælp af et grafisk neuralt netværk til studerende, der kæmper med psykisk sygdom.
 

Tidsstempel:

Mere fra KDnuggets