Corrispondenza di stringhe Python senza sintassi RegEx complessa

Corrispondenza di stringhe Python senza sintassi RegEx complessa

Nodo di origine: 1935271

Corrispondenza di stringhe Python senza sintassi RegEx complessa
Immagine dell'autore
 

Ho una relazione di amore e odio con le espressioni regolari (RegEx), specialmente in Python. Adoro il modo in cui puoi estrarre o abbinare le stringhe senza scrivere più funzioni logiche. È persino migliore della funzione di ricerca di stringhe. 

Quello che non mi piace è quanto sia difficile per me imparare e comprendere i pattern RegEx. Posso occuparmi della semplice corrispondenza di stringhe, come l'estrazione di tutti i caratteri alfanumerici e la pulizia del testo per le attività di PNL. Le cose si fanno più difficili quando si tratta di estrarre indirizzi IP, e-mail e ID dal testo spazzatura. Devi scrivere un modello di stringa RegEx complesso per estrarre l'elemento richiesto. 

Per semplificare le complesse attività RegEx, impareremo a conoscere un semplice pacchetto Python chiamato pregex. Inoltre, esamineremo anche alcuni esempi di estrazione di date ed e-mail da una lunga stringa di testo.  

Pregex è un'API di livello superiore costruita sopra il modulo `re`. È una RegEx senza schemi RegEx complessi che rendono facile per qualsiasi programmatore capire e ricordare le espressioni regolari. Inoltre, non è necessario raggruppare schemi o sfuggire ai metacaratteri ed è modulare. 

Puoi semplicemente installare la libreria usando PIP.

pip install pregex

 

Per testare la potente funzionalità di PREgEx, utilizzeremo il codice di esempio modificato dal file documentazione

Nell'esempio seguente, stiamo estraendo l'URL HTTP o un indirizzo IPv4 con un numero di porta. Non dobbiamo creare una logica complessa per questo. Possiamo usare le funzioni integrate `HttpUrl` e `IPv4`.

  1. Crea un numero di porta usando AnyDigit(). La prima cifra della porta non deve essere zero e le successive tre cifre possono essere qualsiasi numero. 
  2. Utilizzare Both() per aggiungere più logiche da estrarre, URL HTTP o indirizzo IP con un numero di porta. 
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
)

 

Useremo una lunga stringa di testo con caratteri e descrizioni. 

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

 

Prima di estrarre la stringa corrispondente, diamo un'occhiata al pattern RegEx. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Uscita

Come possiamo vedere, è difficile leggere o persino capire cosa sta succedendo. È qui che brilla PREgEx. Per fornirti un'API di facile utilizzo per l'esecuzione di complesse attività di espressione regolare. 

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

 

Proprio come `re.match`, useremo `.get_matches(text)` per estrarre la stringa richiesta.

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

 

Uscita

Abbiamo estratto sia l'indirizzo IP con il numero di porta che due URL web. 

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

Diamo un'occhiata a un paio di esempi in cui possiamo comprendere il pieno potenziale di PREgEx. 

In questo esempio, estrarremo determinati tipi di modelli di data dal testo sottostante.

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

 

Utilizzando Exactly() e AnyDigit(), creeremo il giorno, il mese e l'anno della data. Il giorno e il mese hanno due cifre, mentre l'anno ha 4 cifre. Sono separati da trattini "-".

Dopo aver creato il modello, eseguiremo `get_match` per estrarre la stringa corrispondente. 

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)

 

Uscita

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

 

Diamo un'occhiata al pattern RegEx usando la funzione `get_pattern()`. 

regex_pattren = pre.get_pattern()
print(regex_pattren)

 

Uscita

Come possiamo vedere, ha una semplice sintassi RegEx. 

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

Il secondo esempio è un po' complesso, in cui estrarremo indirizzi email validi dal testo spazzatura. 

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

 

  • Creare un Utente modello con `OneOrMore()`. Useremo `AnyButFrom()` per rimuovere "@" e lo spazio dalla logica. 
  • Simile a Utente modello creiamo un azienda modello rimuovendo il carattere aggiuntivo "." dalla logica.
  • Per la dominio,  useremo `MatchAtLineEnd()` per iniziare la ricerca dalla fine con due o più caratteri qualsiasi tranne "@", spazio e punto.  
  • Combina tutti e tre per creare il modello finale: utente@azienda.dominio.
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)

 

Uscita

Come possiamo vedere, PRegEx ha identificato due indirizzi email validi. 

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

 

Nota: entrambi gli esempi di codice sono versioni modificate di work by Il PyCoach

Se sei uno scienziato di dati, un analista o un appassionato di PNL, dovresti usare PREgEx per pulire il testo e creare una logica semplice. Ridurrà la tua dipendenza dai framework NLP poiché la maggior parte della corrispondenza può essere eseguita utilizzando una semplice API. 

In questo mini tutorial, abbiamo imparato a conoscere il pacchetto Python PRegEx e i suoi casi d'uso con esempi. Puoi saperne di più leggendo il funzionario documentazione o risolvere un parola problema utilizzando espressioni regolari programmabili.

 
 
Abid Ali Awan (@1abidaliawan) è un professionista di data scientist certificato che ama creare modelli di machine learning. Attualmente si sta concentrando sulla creazione di contenuti e sulla scrittura di blog tecnici sulle tecnologie di apprendimento automatico e scienza dei dati. Abid ha conseguito un Master in Technology Management e una laurea in Ingegneria delle Telecomunicazioni. La sua visione è quella di costruire un prodotto di intelligenza artificiale utilizzando una rete neurale grafica per studenti alle prese con malattie mentali.
 

Timestamp:

Di più da KDnuggets