regex Python

Come nuovo sviluppatore, le espressioni regolari (o regex come è comunemente noto) possono essere scoraggianti a causa della sintassi strana e poco familiare:

Quando ero un nuovo sviluppatore e ho visto l’espressione sopra per la prima volta, ricordo che il mio primo pensiero è stato "dire cosa? Non sarò mai in grado di imparare quel gobbledygook. Questo è troppo per me. Non posso farlo."

Ma tu puoi! è solo questione di superare quella sensazione opprimente iniziale che le espressioni regolari siano troppo estranee. Proprio come imparare o parlare una lingua straniera ‚Äî una volta che ci hai preso la mano, verrà in modo abbastanza naturale. Lo prometto!

In questo articolo, diamo un’occhiata a cosa sono le espressioni regolari, perché vengono utilizzate e come usarle in Python. Al termine di questo articolo, avrai una solida conoscenza delle espressioni regolari in modo da poter interpretare il significato dell’espressione sopra!

Cosa sono le espressioni regolari?

Quando diamo un’occhiata a cos’è un’espressione regolare, dobbiamo ricordarci che cos’è una stringa. Ricorda che una stringa è solo una raccolta di caratteri uniti e delimitati da una serie di virgolette:

 "Ciao mondo" "555-555-5555"    "John Doe 123 Main St. Anywhere, USA 99999-9999"   "[email protected]"

Questi sono tutti esempi di stringhe. Possono essere di qualsiasi lunghezza o nessuna lunghezza. Le espressioni regolari, o più comunemente abbreviate in regex, sono espressioni i cui componenti corrispondono a modelli con stringhe per trovare una sorta di informazione.

L’81% dei partecipanti ha dichiarato si sono sentiti più sicuri delle loro prospettive di lavoro nel settore tecnologico dopo aver frequentato un bootcamp. Fatti abbinare a un bootcamp oggi.

Il laureato medio del bootcamp ha trascorso meno di sei mesi nella transizione di carriera, dall’avvio di un bootcamp alla ricerca del primo lavoro.

Che cosa c’è di bello nelle espressioni regolari è che non gli interessa necessariamente la lingua in cui stai codificando in ‚Äî è abbastanza indipendente dal linguaggio. La differenza sta nei metodi del linguaggio e nel modo in cui eseguire azioni utilizzando tali espressioni.

A cosa servono le espressioni regolari?

Regex è un modello che vorremmo cercare specificamente in una stringa. Possiamo usare l’espressione regolare per cercare una frase o un modello particolare per sostituirlo con qualcos’altro, oppure possiamo convalidare i moduli per essere certi che un utente stia inserendo informazioni in un determinato formato in modo che sia coerente tra tutti gli utenti.

Cerca e sostituisci

Supponiamo per esempio che abbiamo un numero di telefono presentato in questo formato:

 555 555 5555 

Questo è un formato valido per un numero di telefono negli Stati Uniti. Ma se volessimo sostituire gli spazi con i trattini? O aggiungere parentesi intorno al prefisso e un trattino per renderlo più leggibile?

Possiamo usare le espressioni regolari per questo! Nella prossima sezione vedremo come farlo con Python ‚Äî per ora voglio che tu abbia un’idea generale di cosa puoi fare con le espressioni regolari e di come possono essere utili.

Il risultato che vedremmo dopo una ricerca e sostituiremo su un numero di telefono in Python per il formato che vorremmo usare sarebbe:

Non è necessario codificare o cercare un valore o un indice specifico della stringa nelle espressioni regolari perché possiamo semplicemente cercare i modelli nelle stringhe e manipolare tutti i record che dobbiamo abbinare.

Convalida

Hai mai compilato qualcosa su un sito solo per visualizzarlo un messaggio di errore a causa di un simbolo mancato o di uno schema che non hai seguito? Molto probabilmente sono state utilizzate espressioni regolari per assicurarti che il tuo input corrispondesse a ciò che il loro database sta cercando.

Questo si chiama convalida ed è super utile quando si creano moduli per essere certi che un numero di telefono segua il formato in cui desideri che sia o che un indirizzo e-mail sia un indirizzo e-mail formattato correttamente, o che una password corrisponda ai parametri che hai impostato per essere una password valida (lunghezza, caratteri speciali, cifre, maiuscole o minuscole , ecc.).

Questo aiuta a prevenire errori nel database avvisando l’utente di errori di battitura o modelli non corrispondenti.

Nella sezione successiva, daremo un’occhiata ai componenti o ai matcher di pattern che costruiscono le espressioni regolari.

Tipi di Regex Pattern Matcher

Caratteri letterali, metacaratteri e quantificatori creano i tipi di pattern matcher che vediamo in regex. Un pattern matcher è un carattere che viene utilizzato per aiutare a trovare un pattern in una stringa. è l’elemento costitutivo principale di un’espressione regolare.

Caratteri letterali

L’esempio più elementare di un comparatore di pattern in regex è un carattere letterale. Corrisponde a un carattere oa una stringa codificati.

Esempi:

ciao ‚áí raccolta di cinque caratteri distinti.

Quando un modello regex viene applicato qui, cerca ciascuno di questi caratteri in successione. "ciao", "ciao" o "ciao" passerebbe un controllo del modello, ma "Hello", "helo" o "HeLlo" non lo farebbe.

"Il Karma professionale è entrato nella mia vita quando ne avevo più bisogno e mi ha aiutato rapidamente ad abbinarmi a un bootcamp. Due mesi dopo la laurea, ho trovato il lavoro dei miei sogni in linea con i miei valori e obiettivi nella vita!"

Venus, Software Engineer presso Rockbot

A ‚áí raccolta di un carattere distinto.

Poiché l’espressione regolare cerca caratteri distinti, fa anche distinzione tra maiuscole e minuscole. Quindi "A" passerebbe, ma "un" non lo farebbe. Ne parleremo meglio tra un po’.

Una frase semplice. ‚áí raccolta di diversi caratteri distinti.

Regex cerca ogni carattere nell’espressione in successione quando esamina una stringa. Se "Una frase semplice" non è nella stringa cercata esattamente come è scritto nell’espressione regolare, non passerebbe.

Caratteri di escape

Dai un’occhiata all’ultimo esempio. Notare che c’è un davanti al punto. Un punto nella sintassi delle espressioni regolari è sinonimo di parole chiave in linguaggi come JavaScript o Python.

Non puoi utilizzare un punto/punto da solo se vuoi che faccia parte di uno schema in espressioni regolari. Devi eseguire l’escape del carattere affinché il motore delle espressioni regolari lo interpreti come una rappresentazione letterale di un punto invece del significato dell’espressione regolare.

Ecco alcune altre sequenze speciali di caratteri che devono essere sfuggiti se si desidera il carattere letterale invece del significato tradotto in cui il motore regex lo compila.

  • Asterisco *
  • Backslash /
  • Più +
  • Caretto ^
  • Segno del dollaro $
  • Punto/punto .
  • Tubo |
  • Domanda Mark ?
  • Parentesi ‚Äì entrambi i tipi ()
  • parentesi graffe ‚Äì entrambi i tipi {}

I caratteri letterali nell’espressione regolare corrispondono esattamente al carattere che includi come parte del modello. Se vuoi includere un carattere che è elencato sopra, assicurati di evitarlo in modo che possa anche far parte della tua regex.

Common Matchers

Lo scopo di un matcher è quello di abbinare più lettere in uno schema. Questa raccolta di simboli di corrispondenza dei modelli è abbastanza coerente tra i linguaggi di programmazione che utilizzano regex.

CorrispondenteDescrizioneEsempio
.Corrisponde a qualsiasi caratterenw corrisponderebbe a now, naw o new, ecc. Qualsiasi carattere supera il test
^regexCerca il pattern in inizio della riga^hello corrisponderebbe a ciao in una riga che iniziava con quel pattern
regex$Cerca il pattern alla fine della rigaworld$ corrisponderebbe al mondo in una riga che terminava con quel modello
[abc]Corrisponde a, b o c [misp]è considerato un set e corrisponderebbe a qualsiasi stringa che contenga uno di questi caratteri.
Ad esempio, potrebbe corrispondere a tutte le singole lettere in mississippi e miss, ma solo ad alcune delle lettere in marsh e missouri
[abc][xyz]Matto hes a, b o c seguito da x, y o z/[Mm][sip]/ corrisponderebbe a qualsiasi stringa che inizia con M o m, seguita da un insieme che ha una delle caratteri in [sip]
[^abc]Non a, b o c[^rstlne] corrisponderebbero qualsiasi carattere che non sia r, s, t, l, n o e
[a-zA-Z0-9]Corrisponde a qualsiasi carattere all’interno dell’intervallo[an] corrisponderebbe a qualsiasi carattere compreso tra a e n. e, end, blind, can, hanno tutti caratteri che corrispondono interamente qui
A|BA o BM|m. corrisponderebbe a qualsiasi parola o frase di almeno due caratteri di lunghezza che corrisponde a una M o una m più almeno uno o più altri caratteri.
CATCorrisponde a C, seguito da A, seguito da Tciao mondo corrisponderà esattamente a ciao mondo

Metacaratteri

Anche le espressioni regolari utilizzano i metacaratteri per descrivere un modello. I metacaratteri hanno una sorta di significato dietro di loro e descriveranno la forma del modello.

MetacarattereDescrizioneEsempio
dCorrisponde a qualsiasi cifrad corrisponderebbe a 1, 2 o 3, ecc. Abbreviazione per [0-9]
DCorrisponde a qualsiasi carattere non numerico D corrisponderebbe a A, B, g, ecc. Abbreviazione per [^0-9]
sCorrisponde a qualsiasi spazio bianco caratterecorrisponde a nuove righe, tabulazioni, spazi, ecc.
SCorrisponde a qualsiasi -carattere spazio bianco S corrisponde a qualsiasi carattere tranne uno spazio bianco.
wCorrisponde a qualsiasi carattere di parolaUn carattere di parola, abbreviazione di [a-zA-Z_0-9]
WCorrisponde a qualsiasi carattere non di parola[W] corrisponderebbe a qualsiasi carattere speciale. Scorciatoia per [^w]

Nota: i metacaratteri delle lettere maiuscole (W, D, ecc.) di solito corrispondono all’opposto di cosa fanno i metacaratteri delle lettere minuscole (w, d, ecc.).

Quantificatori

QuantificatoreDescrizioneEsempio
+Uno o più caratteri precedentid+ corrisponde a due o più cifre
*Zero o più del carattere precedente.* corrisponderebbe a qualsiasi carattere 0 o più volte
Nota: tecnicamente una stringa vuota soddisferebbe questa regex!
?Zero o uno dei carattere precedentea?.* corrisponderebbe a a, any, hello, world
{number}Corrisponde esattamente al carattere precedente numero di volte d{3} corrisponde esattamente a tre cifre [0-9]
{num1,num2}Corrisponde al carattere precedente in un intervallo di numerid{3,5} corrisponde da 3 a 5 cifre che sono [0-9]

Utilizza i quantificatori, i metacaratteri e altri matcher come elementi costitutivi delle tue espressioni regolari. La sintassi qui menzionata è simile in più lingue che utilizzano espressioni regolari.

Tuttavia, ci sono alcune cose che vengono utilizzate in Ruby o JavaScript, ad esempio, che non sarebbero trasferibili in Python.

Imparare un po’ maggiori informazioni su come funzionano le espressioni regolari in Python nella prossima sezione.

Come funzionano le espressioni regolari in Python?

Per usare le espressioni regolari in Python importa il re modulo nella parte superiore del tuo file.

è cosi semplice! Non c’è niente di speciale che devi aggiungere o pacchetti che devi scaricare. è già integrato se lo importi.

Il divertimento deriva dall’utilizzo dei diversi metodi disponibili nel modulo re.

re.search(regex, str, flags=0)

Utilizzare la funzione di ricerca quando si desidera applicare un pattern regex a una stringa per vedere se il pattern è contenuto nella stringa. Questo metodo prenderà un modello di espressione regolare e lo troverà ovunque nella stringa.

Se il modello regex NON è contenuto nella stringa, l’interprete restituirà Nessuno. Se c’è una corrispondenza, verrà restituito un oggetto Match che conterrà alcune informazioni su di esso.

L’oggetto Match ha una proprietà e due metodi che possono essere utilizzati per recuperare informazioni sulla corrispondenza:

match_obj.span() un metodo che restituisce una tupla contenente le posizioni di inizio e fine della corrispondenza (la fine la posizione è inclusiva).

match_obj.string una proprietà che restituisce la stringa passata alla funzione.

match_obj.group() un metodo che restituisce la parte della stringa in cui c’era una corrispondenza.

match_obj qui sarà sostituito con la variabile che assegni al risultato del tuo re .search() metodo. Ecco un esempio che utilizza ciascun metodo e proprietà:

La cosa principale da ricordare qui è che il Match oggetto in Python ha metodi e properties.

Utilizziamo la stringa della proprietà per accedere alla stringa originale su cui abbiamo testato l’espressione regolare, il metodo span per accedere agli indici e il metodo group per ottenere il risultato effettivo della corrispondenza. < br>

Esistono altri metodi e proprietà a cui è possibile fare riferimento nei documenti Python, ma questi sono utili per iniziare.

Argomenti facoltativi: flags

C’è un argomento opzionale che puoi usare anche con il metodo di ricerca del modulo re. Per usarlo assegna il parametro flags a una lista di flag che vorresti usare. Il valore predefinito è 0. Alcune delle opzioni più popolari includono:

  • re.DEBUG

Questo flag mostrerà le informazioni di debug sulla regex compilata, se necessario.

  • re.I
    re.IGNORECASE

Corrispondenza senza distinzione tra maiuscole e minuscole. Questo ignorerà il caso dei caratteri passati in insiemi o caratteri letterali in modo che corrispondano sia le lettere maiuscole che quelle minuscole.

  • re.M
    re.MULTILINE

Modalità multilinea. Consente l’uso dei metacaratteri regex di inizio riga e fine riga nelle stringhe multilinea. Altrimenti guarderebbe solo all’inizio e alla fine della stringa. Senza il flag multilinea, il motore regex considera la stringa una riga.

  • re.S
    re.DOTALL

Questo flag dice il motore regex che il carattere punto corrisponderà a qualsiasi carattere. Il comportamento predefinito prevede che il carattere punto corrisponda a tutti i caratteri tranne il carattere di nuova riga.

  • re.X
    re.VERBOSE

Il flag verbose ti consente di aggiungere commenti alla tua espressione regolare per scomporre l’espressione e commentare il suo scopo. Questo può essere di grande aiuto mentre stai imparando l’espressione regolare in Python.

Questo frammento di codice prende l’esempio dall’alto e incorpora alcuni dei flag sopra elencati. Quando usi più di un flag, usa l’operatore bit a bit | tra ciascuno come separatore.

Prenditi il ​​tempo necessario per notare come i flag ci aiutano a testare la nostra stringa. Prova a togliere il parametro flags. La stringa restituisce un risultato? In caso negativo, cosa restituisce come risultato?

Ricorda che il metodo di ricerca sul modulo re accetta l’espressione regolare, la stringa da cercare e un parametro flag opzionale. Un valore truey restituirà un Match Object a cui sono associati proprietà e metodi. Un valore falso restituisce un oggetto NoneType.

re.match(regex, str, flags=0)

Utilizzare match quando stai cercando di far corrispondere un modello regex all’inizio della stringa. Se vuoi far corrispondere il modello regex in qualsiasi punto della stringa, usa invece il metodo di ricerca sopra.

Quando guardi questo codice in un interprete Python, vedrai che il primo metodo, match(), non restituirà un oggetto Match, ma invece Nessuno. Il secondo consente di guardare all’interno della stringa e restituirà un oggetto Match. Questo perché il metodo match() guarda solo all’inizio di una stringa, anche se viene alzato il flag re.MULTILINE.

re.sub(findRegex, replaceWith, str, count=0, flags=0)

Il metodo sub() nel modulo re accetta un regex, trova la corrispondenza più a sinistra in una stringa e la sostituisce con qualcos’altro. Ripete la stessa operazione per il numero di volte indicato nel parametro conteggio. Se non è presente alcun parametro di conteggio o è impostato su zero, tutte le occorrenze verranno sostituite.

All’inizio di questo articolo abbiamo parlato della riformattazione di un numero di telefono. Diamo un’occhiata a come farlo qui:

Questo prende la nostra stringa telefonica, trova tutto occorrenze di spazi bianchi e lo sostituisce con un trattino. In questo caso, finiamo con 555-555-5555.

Proviamo una riformattazione più difficile:

In questo esempio, andiamo all’inizio della riga per aggiungere una parentesi aperta e assegnare quella nuova stringa a una variabile.

Quindi prendiamo quella variabile appena assegnata (left_parens ) e usalo per eseguire la stessa operazione sulla ricerca del successivo carattere di spazio vuoto disponibile per sostituirlo con una parentesi chiusa. Questo è assegnato a right_parens.

Infine, prendiamo la variabile right_parens e la usiamo per eseguire la stessa operazione sul carattere di spazio bianco finale per sostituiscilo con un trattino.

Questo ci darà (555)555-5555.

Per ricapitolare, il sub () accetta un modello regex, una stringa o una funzione sostitutiva, la stringa effettiva su cui vogliamo eseguire il sub() e un conteggio. Se non forniamo un conteggio, eseguirà le sostituzioni in tutte le occorrenze. Restituisce la nuova stringa con le sostituzioni eseguite.

Conclusione

Le espressioni regolari sono un modo per convalidare i dati o per cercare e sostituire i caratteri nelle nostre stringhe. Regex è costituito da metacaratteri, quantificatori e caratteri letterali che possono essere utilizzati per testare le nostre stringhe per vedere se supera un test di convalida o per cercare e sostituire Corrispondenze.

Regex può essere un po’ all’inizio travolgente, ma una volta capito, è un po’ come andare in bicicletta. Sarà nel retro della tua memoria e super facile da recuperare.

Quando senti di avere un’idea di ciò che viene fuori in questo articolo, dai un’occhiata ai documenti Python per vedere cos’altro si può fare con le espressioni regolari. Sicuramente dai un’occhiata ai metodi compile e split.

Buona regex!