Python-strängmatchning utan komplex RegEx-syntax

Python-strängmatchning utan komplex RegEx-syntax

Källnod: 1935271

Python-strängmatchning utan komplex RegEx-syntax
Bild av författare
 

Jag har ett hat-och-kärleksförhållande till reguljära uttryck (RegEx), speciellt i Python. Jag älskar hur du kan extrahera eller matcha strängar utan att skriva flera logiska funktioner. Det är till och med bättre än sökfunktionen String. 

Vad jag inte gillar är hur det är svårt för mig att lära mig och förstå RegEx-mönster. Jag kan hantera enkel strängmatchning, som att extrahera alla alfanumeriska tecken och rensa texten för NLP-uppgifter. Saker och ting blir svårare när det gäller att extrahera IP-adresser, e-postmeddelanden och ID:n från skräppost. Du måste skriva ett komplext RegEx-strängmönster för att extrahera det önskade objektet. 

För att göra komplexa RegEx-uppgifter enkla kommer vi att lära oss om ett enkelt Python-paket som heter pregex. Dessutom kommer vi också att titta på några exempel på att extrahera datum och e-postmeddelanden från en lång textsträng.  

Pregex är ett API på högre nivå byggt ovanpå "re"-modulen. Det är ett RegEx utan komplexa RegEx-mönster som gör det enkelt för alla programmerare att förstå och komma ihåg reguljära uttryck. Dessutom behöver du inte gruppera mönster eller fly metakaraktärer, och det är modulärt. 

Du kan helt enkelt installera biblioteket med PIP.

pip install pregex

 

För att testa den kraftfulla funktionen hos PRegEx kommer vi att använda modifierad exempelkod från dokumentation

I exemplet nedan extraherar vi antingen HTTP URL eller en IPv4-adress med ett portnummer. Vi behöver inte skapa komplex logik för det. Vi kan använda inbyggda funktioner `HttpUrl` och `IPv4`.

  1. Skapa ett portnummer med AnyDigit(). Den första siffran i porten ska inte vara noll, och de nästa tre siffrorna kan vara vilket nummer som helst. 
  2. Använd Ether() för att lägga till flera logiker att extrahera, antingen HTTP URL eller IP-adress med ett 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 kommer att använda en lång textsträng med tecken och beskrivningar. 

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

 

Innan vi extraherar den matchande strängen, låt oss titta på RegEx-mönstret. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Produktion

Som vi kan se är det svårt att läsa eller ens förstå vad som pågår. Det är här PRegEx lyser. För att ge dig ett människovänligt API för att utföra komplexa reguljära uttrycksuppgifter. 

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

 

Precis som `re.match` kommer vi att använda `.get_matches(text)` för att extrahera den nödvändiga strängen.

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

 

Produktion

Vi har extraherat både IP-adressen med portnummer och två webbadresser. 

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

Låt oss titta på ett par exempel där vi kan förstå den fulla potentialen hos PRegEx. 

I det här exemplet kommer vi att extrahera vissa typer av datummönster från texten nedan.

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

 

Genom att använda Exactly() och AnyDigit() skapar vi dagen, månaden och året för datumet. Dagen och månaden har två siffror, medan året har 4 siffror. De är åtskilda av "-" bindestreck.

Efter att ha skapat mönstret kommer vi att köra "get_match" för att extrahera den matchande strängen. 

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']

 

Låt oss titta på RegEx-mönstret genom att använda funktionen `get_pattern()`. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Produktion

Som vi kan se har den en enkel RegEx-syntax. 

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

Det andra exemplet är lite komplext, där vi kommer att extrahera giltiga e-postadresser från skräppost. 

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

 

  • Skapa en användare mönster med "OneOrMore()". Vi kommer att använda `AnyButFrom()` för att ta bort "@" och mellanslag från logiken. 
  • Liknande a användare mönster vi skapar ett företag mönster genom att ta bort det extra tecknet "." från logiken.
  • För domän,  vi kommer att använda `MatchAtLineEnd()` för att starta sökningen från slutet med två eller fler tecken förutom "@", mellanslag och punkt.  
  • Kombinera alla tre för att skapa det slutliga mönstret: användare@företag.domän.
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 identifierat två giltiga e-postadresser. 

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

 

Notera: båda kodexemplen är modifierade versioner av arbete av PyCoachen

Om du är en datavetare, analytiker eller NLP-entusiast bör du använda PRegEx för att rensa texten och skapa enkel logik. Det kommer att minska ditt beroende av NLP-ramverk eftersom det mesta av matchningen kan göras med enkla API. 

I denna minihandledning har vi lärt oss om Python-paketet PRegEx och dess användningsfall med exempel. Du kan lära dig mer genom att läsa den officiella dokumentation eller lösa a med ord problem med att använda programmerbara reguljära uttryck.

 
 
Abid Ali Awan (@1abidaliawan) är en certifierad datavetare som älskar att bygga modeller för maskininlärning. För närvarande fokuserar han på att skapa innehåll och skriva tekniska bloggar om maskininlärning och datavetenskap. Abid har en magisterexamen i Technology Management och en kandidatexamen i telekommunikationsteknik. Hans vision är att bygga en AI-produkt med hjälp av ett grafiskt neuralt nätverk för studenter som kämpar med psykisk ohälsa.
 

Tidsstämpel:

Mer från KDnuggets