Mastering Regular Expressions with Python’ ‘Masterizzare le espressioni regolari con Python

Mastering Regular Expressions with Python' -> 'Masterizzare le espressioni regolari con Python

 

Introduzione

  Le espressioni regolari, o regex, sono uno strumento potente per manipolare testi e dati. Forniscono un modo conciso e flessibile per ‘trovare’ (specificare e riconoscere) stringhe di testo, come caratteri particolari, parole o schemi di caratteri. Le regex sono utilizzate in vari linguaggi di programmazione, ma in questo articolo ci concentreremo sull’utilizzo delle regex con Python.

Python, con la sua sintassi chiara e leggibile, è un ottimo linguaggio per imparare e applicare le regex. Il modulo re di Python fornisce supporto per le operazioni di regex in Python. Questo modulo contiene funzioni per cercare, sostituire e dividere il testo in base a schemi specificati. Padroneggiando le regex in Python, è possibile manipolare ed analizzare in modo efficiente i dati di testo.

Questo articolo ti guiderà dalle basi alle operazioni più complesse con le regex in Python, fornendoti gli strumenti per affrontare qualsiasi sfida di elaborazione del testo che incontri. Inizieremo con le corrispondenze di caratteri semplici, per poi esplorare corrispondenze di schemi più complessi, raggruppamenti e asserzioni lookaround. Iniziamo!

 

Schemi di base delle regex

  Nel suo nucleo, la regex opera sul principio della corrispondenza di schemi in una stringa. La forma più diretta di questi schemi sono le corrispondenze letterali, dove il modello cercato è una sequenza diretta di caratteri. Ma gli schemi delle regex possono essere più sfumati e capaci di una semplice corrispondenza letterale.

In Python, il modulo re fornisce una serie di funzioni per gestire le espressioni regolari. La funzione re.search(), ad esempio, esamina una stringa data, cercando qualsiasi posizione in cui un modello regex corrisponda. Illustreremo con un esempio:

import re

# Definisci un modello
modello = "Python"

# Definisci un testo
testo = "Amo Python!"

# Cerca il modello
corrispondenza = re.search(modello, testo)

print(corrispondenza)

 

Questo codice Python cerca all’interno del testo nella variabile testo il modello definito nella variabile modello. La funzione re.search() restituisce un oggetto di tipo Match se il modello viene trovato nel testo, o None se non viene trovato.

L’oggetto Match include informazioni sulla corrispondenza, compresa la stringa di input originale, l’espressione regolare utilizzata e la posizione della corrispondenza. Ad esempio, utilizzando corrispondenza.start() e corrispondenza.end() è possibile ottenere le posizioni di inizio e fine della corrispondenza nella stringa.

Tuttavia, spesso non cerchiamo solo parole esatte – vogliamo corrispondere a schemi. Ecco dove entrano in gioco i caratteri speciali. Ad esempio, il punto (.) corrisponde a qualsiasi carattere tranne un ritorno a capo. Vediamolo in azione:

# Definisci un modello
modello = "P.th.n"

# Definisci un testo
testo = "Amo Python e Pithon!"

# Cerca il modello
corrispondenze = re.findall(modello, testo)

print(corrispondenze)

 

Questo codice cerca nella stringa qualsiasi parola di cinque lettere che inizia con una “P”, termina con una “n” e ha “th” al centro. Il punto corrisponde a qualsiasi carattere, quindi corrisponde sia a “Python” che a “Pithon”. Come puoi vedere, anche solo con caratteri letterali e il punto, le regex forniscono uno strumento potente per la corrispondenza di schemi.

Nelle sezioni successive, approfondiremo gli schemi più complessi e le funzionalità avanzate delle regex. Comprendendo questi elementi di base, è possibile costruire schemi più complessi per corrispondere a quasi ogni compito di elaborazione e manipolazione del testo.

 

Meta-caratteri

  Mentre i caratteri letterali costituiscono la base delle espressioni regolari, i meta-caratteri amplificano la loro potenza fornendo definizioni di schemi flessibili. I meta-caratteri sono simboli speciali con significati unici, che modellano il modo in cui il motore regex corrisponde agli schemi. Ecco alcuni meta-caratteri comunemente utilizzati e il loro significato e utilizzo:

  • . (punto) – Il punto è un carattere jolly che corrisponde a qualsiasi carattere tranne un ritorno a capo. Ad esempio, il modello “a.b” può corrispondere a “acb”, “a+b”, “a2b”, ecc.
  • ^ (cappuccio) – Il simbolo del cappuccio indica l’inizio di una stringa. “^a” corrisponderebbe a qualsiasi stringa che inizia con “a”.
  • $ (dollaro) – Al contrario, il segno del dollaro corrisponde alla fine di una stringa. “a$” corrisponderebbe a qualsiasi stringa che termina con “a”.
  • * (asterisco) – L’asterisco indica zero o più occorrenze dell’elemento precedente. Ad esempio, “a*” corrisponde a “”, “a”, “aa”, “aaa”, ecc.
  • + (più) – Simile all’asterisco, il segno più rappresenta una o più occorrenze dell’elemento precedente. “a+” corrisponde a “a”, “aa”, “aaa”, ecc., ma non a una stringa vuota.
  • ? (punto interrogativo) – Il punto interrogativo indica zero o una occorrenza dell’elemento precedente. Rende l’elemento precedente opzionale. Ad esempio, “a?” corrisponde a “” o “a”.
  • { } (parentesi graffe) – Le parentesi graffe quantificano il numero di occorrenze. “{n}” indica esattamente n occorrenze, “{n,}” significa n o più occorrenze e “{n,m}” rappresenta tra n e m occorrenze.
  • [ ] (parentesi quadre) – Le parentesi quadre specificano un insieme di caratteri, dove qualsiasi singolo carattere racchiuso tra le parentesi può corrispondere. Ad esempio, “[abc]” corrisponde a “a”, “b” o “c”.
  • \ (barra rovesciata) – La barra rovesciata viene utilizzata per escludere caratteri speciali, trattando effettivamente il carattere speciale come letterale. “\$” corrisponderebbe a un segno di dollaro nella stringa invece di indicare la fine della stringa.
  • | (pipe) – La pipe funziona come un OR logico. Corrisponde al modello prima o al modello dopo la pipe. Ad esempio, “a|b” corrisponde a “a” o “b”.
  • ( ) (parentesi tonde) – Le parentesi tonde vengono utilizzate per raggruppare e catturare corrispondenze. Il motore regex tratta tutto ciò che si trova tra parentesi come un singolo elemento.

Padronizzare questi meta-caratteri apre un nuovo livello di controllo sulle vostre attività di elaborazione del testo, permettendovi di creare pattern più precisi e flessibili. Il vero potere delle espressioni regolari diventa evidente quando imparate a combinare questi elementi in espressioni complesse. Nella sezione seguente, esploreremo alcune di queste combinazioni per mostrare la versatilità delle espressioni regolari.

Insiemi di caratteri

Gli insiemi di caratteri nelle espressioni regolari sono strumenti potenti che consentono di specificare un gruppo di caratteri da cercare. Posizionando i caratteri all’interno delle parentesi quadre “[]”, si crea un insieme di caratteri. Ad esempio, “[abc]” corrisponde a “a”, “b” o “c”.

Ma gli insiemi di caratteri offrono più di una semplice specifica dei singoli caratteri: offrono la flessibilità di definire intervalli di caratteri e gruppi speciali. Vediamo:

Intervalli di caratteri: È possibile specificare un intervallo di caratteri utilizzando il trattino (“-“). Ad esempio, “[a-z]” corrisponde a qualsiasi carattere alfabetico minuscolo. È possibile definire anche più intervalli all’interno di un unico insieme, come “[a-zA-Z0-9]” che corrisponde a qualsiasi carattere alfanumerico.

Gruppi speciali: Alcuni insiemi di caratteri predefiniti rappresentano gruppi di caratteri comunemente usati. Questi sono comodi abbreviazioni:

  • \d: Corrisponde a qualsiasi cifra decimale; equivalente a [0-9]
  • \D: Corrisponde a qualsiasi carattere non numerico; equivalente a [^0-9]
  • \w: Corrisponde a qualsiasi carattere alfanumerico (lettera, numero, trattino basso); equivalente a [a-zA-Z0-9_]
  • \W: Corrisponde a qualsiasi carattere non alfanumerico; equivalente a [^a-zA-Z0-9_]
  • \s: Corrisponde a qualsiasi carattere di spazio (spazi, tabulazioni, interruzioni di linea)
  • \S: Corrisponde a qualsiasi carattere non di spazio

Insiemi di caratteri negati: Posizionando un accento circonflesso “^” come primo carattere all’interno delle parentesi quadre, si crea un insieme negato, che corrisponde a qualsiasi carattere che non è nell’insieme. Ad esempio, “[^abc]” corrisponde a qualsiasi carattere tranne “a”, “b” o “c”.

Vediamo tutto questo in azione:

import re

# Crea un pattern per un numero di telefono
pattern = "\d{3}-\d{3}-\d{4}"

# Definisci un testo
text = "Il mio numero di telefono è 123-456-7890."

# Cerca il pattern
match = re.search(pattern, text)

print(match)

Questo codice cerca un pattern di un numero di telefono statunitense nel testo. Il pattern “\d{3}-\d{3}-\d{4}” corrisponde a tre cifre, seguite da un trattino, seguite da altre tre cifre, un altro trattino e infine quattro cifre. Corrisponde con successo a “123-456-7890” nel testo.

Gli insiemi di caratteri e le sequenze speciali associate offrono un notevole impulso alle capacità di corrispondenza dei vostri pattern, offrendo un modo flessibile ed efficiente per specificare i caratteri che desiderate cercare. Comprendendo questi elementi, siete sulla strada giusta per sfruttare appieno il potenziale delle espressioni regolari.

Alcuni pattern comuni

Email

Estrazione di email è un compito comune che può essere fatto con le espressioni regolari. Il seguente pattern corrisponde ai formati di email più comuni:

# Definisci un pattern
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,7}\b'

# Cerca il pattern
match = re.findall(pattern, text)

print(match)

Numeri di telefono

I numeri di telefono possono variare di formato, ma ecco un pattern che corrisponde ai numeri di telefono nordamericani:

# Definisci un pattern
pattern = r'\b\d{3}[-.\s]?\d{3}[-.\s]?\d{4}\b'

# Cerca il pattern
...

Indirizzi IP

Per corrispondere a un indirizzo IP, sono necessari quattro numeri (0-255) separati da punti:

# Definisci un pattern
pattern = r'\b(?:\d{1,3}\.){3}\d{1,3}\b'

# Cerca il pattern
...

 

URL Web

  Gli URL Web seguono un formato coerente che può essere abbinato a questo pattern:

# Definisci un pattern
pattern = r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'

# Cerca il pattern
...

 

Tag HTML

  I tag HTML possono essere abbinati al seguente pattern. Fai attenzione, poiché questo non catturerà gli attributi all’interno dei tag:

# Definisci un pattern
pattern = r'<[^>]+>'

# Cerca il pattern
...

 

 

Suggerimenti e consigli

  Ecco alcuni suggerimenti pratici e le migliori pratiche per utilizzare le espressioni regolari in modo efficace.

  1. Inizia con semplicità: Inizia con pattern semplici e gradualmente aggiungi complessità. Tentare di risolvere un problema complesso in un’unica volta può essere opprimente.
  2. Testa incrementalmente: Dopo ogni modifica, testa le tue espressioni regolari. Questo facilita la localizzazione e la risoluzione dei problemi.
  3. Usa stringhe grezze: In Python, usa stringhe grezze per i pattern delle espressioni regolari (ad esempio, r”testo”). Ciò assicura che Python interpreti letteralmente la stringa, evitando conflitti con le sequenze di escape di Python.
  4. Sii specifico: Più specifica è la tua espressione regolare, meno probabilità ci saranno di abbinare testo non desiderato per errore. Ad esempio, invece di .*, considera di utilizzare .+? per abbinare il testo in modo non avido.
  5. Usa strumenti online: I tester di espressioni regolari online possono aiutarti a costruire e testare le tue espressioni regolari. Questi strumenti possono mostrare abbinamenti in tempo reale, gruppi e fornire spiegazioni per le tue espressioni regolari. Alcuni tra i più popolari sono regex101 e regextester.
  6. Leggibilità oltre alla brevità: Sebbene le espressioni regolari consentano di scrivere codice molto compatto, possono diventare rapidamente difficili da leggere. Dai priorità alla leggibilità rispetto alla brevità. Usa spazi vuoti e commenti quando necessario.

Ricorda, padroneggiare le espressioni regolari è un percorso e consiste principalmente nell’assemblare blocchi di costruzione. Con pratica e perseveranza, sarai in grado di affrontare qualsiasi compito di manipolazione del testo.

 

Conclusioni

  Le espressioni regolari, o regex, sono veramente uno strumento potente nell’arsenale di Python. La sua complessità potrebbe essere intimidatoria a prima vista, ma una volta che ti immergi nelle sue sfumature, inizi a realizzare il suo vero potenziale. Fornisce una robustezza e versatilità senza pari per la gestione, l’analisi e la manipolazione dei dati di testo, rendendola un’utilità essenziale in numerosi campi come la scienza dei dati, l’elaborazione del linguaggio naturale, il web scraping e molti altri.

Una delle principali forze delle espressioni regolari risiede nella sua capacità di eseguire operazioni intricate di ricerca e estrazione di pattern su volumi massicci di testo con un codice minimo. Pensaci come un motore di ricerca sofisticato che può individuare non solo stringhe di testo precise, ma anche pattern, intervalli e sequenze specifiche. Ciò consente di identificare ed estrarre parti chiave di informazioni dai dati di testo grezzi e non strutturati, che è una necessità comune in compiti come il recupero delle informazioni, la pulizia dei dati e l’analisi del sentiment.

Inoltre, la curva di apprendimento delle espressioni regolari, sebbene apparentemente ripida, non dovrebbe scoraggiare il discente entusiasta. Sì, le espressioni regolari hanno una propria sintassi unica e caratteri speciali che possono sembrare criptici all’inizio. Tuttavia, con un po’ di apprendimento dedicato e pratica, presto apprezzerai la sua struttura logica ed eleganza. L’efficienza e il tempo risparmiato nel processare i dati di testo con le espressioni regolari superano di gran lunga l’investimento iniziale di apprendimento. Pertanto, padroneggiare le espressioni regolari, sebbene sfidante, fornisce ricompense preziose che la rendono una competenza fondamentale per qualsiasi data scientist, programmatore o chiunque si occupi di dati di testo nel proprio lavoro.

I concetti e gli esempi che abbiamo discusso qui sono solo la punta dell’iceberg. Ci sono molti altri concetti di regex da esplorare, come quantificatori, gruppi, asserzioni lookaround e altro ancora. Quindi continua a praticare, sperimentare e padroneggiare le espressioni regolari con Python. Buon codice per l’abbinamento dei pattern!

    Matthew Mayo (@mattmayo13) è un Data Scientist e l’Editor-in-Chief di VoAGI, la principale risorsa online per la scienza dei dati e l’apprendimento automatico. I suoi interessi sono nell’elaborazione del linguaggio naturale, nella progettazione e ottimizzazione degli algoritmi, nell’apprendimento non supervisionato, nelle reti neurali e nei metodi automatizzati di apprendimento automatico. Matthew ha una laurea magistrale in informatica e un diploma post-laurea in data mining. È possibile contattarlo all’indirizzo editor1 at VoAGI[dot]com.