logo

Corrispondenza di modelli in Python con Regex

Potresti avere familiarità con la ricerca di testo premendo ctrl-F e digitando le parole che stai cercando. Le espressioni regolari fanno un ulteriore passo avanti: ti consentono di specificare un modello di testo da cercare. In questo articolo vedremo come funziona il pattern match in Python con Regex.

Regex in Python

Espressioni regolari , chiamato anche espressione regolare , sono descrizioni di un modello di testo. Può rilevare la presenza o l'assenza di un testo abbinandolo a un modello particolare e può anche dividere un modello in uno o più sottomodelli. Ad esempio, a D in una regex sta per un carattere numerico, ovvero qualsiasi singolo numero compreso tra 0 e 9.

Controlla i numeri di telefono usando Regex in Python



La seguente regex viene utilizzata in Pitone per trovare la corrispondenza con una stringa di tre numeri, un trattino, altri tre numeri, un altro trattino e quattro numeri.

Any other string would not match the pattern. ddd-ddd-dddd>

Le espressioni regolari possono essere molto più sofisticate. Ad esempio, aggiungere un 3 tra parentesi graffe ({3}) dopo uno schema è come dire: Abbina questo schema tre volte. Quindi la regex leggermente più breve è la seguente:

np.linspace
d{3}-d{3}-d{4}>

Corrisponde al formato corretto del numero di telefono.

Corrispondenza di modelli con espressioni regolari

Un oggetto Regex ricerca() Il metodo cerca nella stringa che gli viene passata per eventuali corrispondenze con la regex. Gli oggetti match hanno un metodo group() che restituirà il testo effettivamente corrispondente dalla stringa cercata. Puoi anche vedereCheetsheet Regexper maggiori informazioni.

Esempio: Importa il modulo regex con import re. Crea un oggetto Regex con il fileri.compilare()funzione. (Ricordati di utilizzare una stringa grezza.) Passa la stringa che desideri cercare nel metodo search() dell'oggetto Regex. Ciò restituisce un oggetto Match. Chiama il metodo group() dell'oggetto Match per restituire una stringa del testo effettivamente corrispondente.

Python3




# Python program to illustrate> # Matching regex objects> import> re> > # regex object> phoneNumRegex>=> re.>compile>(r>'ddd-ddd-dddd'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(>'Phone number found: '> +> mo.group())>

>

>

Produzione:

Phone number found: 415-555-4242>

Parentesi per raggruppare e catturare con Regex

Uno dei modi per abbinare i modelli con Regex è utilizzare le parentesi attorno ai modelli. Vediamo alcuni esempi diversi per una migliore comprensione.

Oggetti corrispondenti

Supponiamo che tu voglia separare il prefisso dal resto del numero di telefono. L'aggiunta di parentesi creerà gruppi nella regex: (ddd)-(ddd-dddd). Quindi puoi utilizzare il metodo match object group() per prendere il testo corrispondente da un solo gruppo.

Python3




import> re> phoneNumRegex>=> re.>compile>(r>'(ddd)-(ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(mo.group(>1>))> areaCode, number>=> mo.groups()> print>(>'area code:'>, areaCode)> print>(>'number:'>, number)>

>

>

Produzione:

415 area code: 415 number: 555-4242>

Recupera tutti i gruppi contemporaneamente

Se desideri recuperare tutti i gruppi contemporaneamente, utilizza il metodo groups(), facendo attenzione alla forma plurale del nome.

Python3




import> re> phoneNumRegex>=> re.>compile>(r>'(ddd)-(ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(mo.groups())>

>

>

Produzione:

('415', '555-4242')>

Abbina una parentesi

Le parentesi hanno un significato speciale nelle espressioni regolari, ma cosa fare se è necessario abbinare una parentesi nel testo? Ad esempio, è possibile che i numeri di telefono che stai tentando di abbinare abbiano il prefisso impostato tra parentesi. In questo caso, è necessario eseguire l'escape dei caratteri ( e ) con una barra rovesciata. Immettere quanto segue nella shell interattiva:

Python3


np.zeros



import> re> phoneNumRegex>=> re.>compile>(r>'((ddd)) (ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My phone number is (415) 555-4242.'>)> print>(mo.group(>1>))>

>

>

Produzione:

(415)>

I caratteri di escape ( e ) nella stringa grezza passata a re.compile() corrisponderanno ai caratteri effettivi delle parentesi.

Espressioni regolari: raggruppamento e carattere pipe

IL | il carattere è chiamato pipe. Possiamo usarlo ovunque vogliamo abbinare una delle tante espressioni.

Esempio: L'espressione regolare r'Batman|Tina Fey' corrisponderà a 'Batman' o 'Tina Fey'. Quando nella stringa cercata sono presenti sia Batman che Tina Fey, la prima occorrenza del testo corrispondente verrà restituita come oggetto Match.

Python3




# Python program to illustrate> # Matching regex objects> # with multiple Groups with the Pipe> import> re> heroRegex>=> re.>compile> (r>'Batman|Tina Fey'>)> mo1>=> heroRegex.search(>'Batman and Tina Fey.'>)> print>(mo1.group())>

>

>

Produzione:

'Batman'>

Comprendere le parentesi graffe nelle regex

Se abbiamo un gruppo che vogliamo ripetere un numero specifico di volte, segui il gruppo nella regex con un numero tra parentesi graffe.

Ad esempio, la regex (Ha){3} corrisponderà alla stringa 'HaHaHa', ma non corrisponderà a 'HaHa', poiché quest'ultima ha solo due ripetizioni del gruppo (Ha). Invece di un solo numero, puoi specificare un intervallo tra parentesi graffe. L'espressione regolare (Ha){3, 5} corrisponderà a 'HaHaHa', 'HaHaHaHa' e 'HaHaHaHaHa'. Puoi anche tralasciare il primo o il secondo numero tra parentesi graffe per lasciare illimitati il ​​minimo o il massimo. (Ha){3, } corrisponderà a tre o più istanze del gruppo (Ha), mentre (Ha){, 5} corrisponderà da zero a cinque istanze. Le parentesi graffe possono aiutarti a rendere più brevi le tue espressioni regolari.

Esempio 1: In questo esempio utilizzeremo le parentesi graffe per specificare l'occorrenza del pattern che stiamo cercando.

Python3




# Python program to illustrate> # Matching Specific Repetitions> # with Curly Brackets> import> re> haRegex>=> re.>compile>(r>'(Ha){3}'>)> mo1>=> haRegex.search(>'HaHaHa'>)> print>(mo1.group())>

>

>

Produzione:

HaHaHa>

Esempio 2: In questo esempio, definiremo l'occorrenza del modello utilizzando parentesi graffe e quindi cercheremo se esiste o meno un modello specifico.

Python3




metodo Java tostring
# Python program to illustrate> # Matching Specific Repetitions> # with Curly Brackets> import> re> haRegex>=> re.>compile>(r>'(Ha){3}'>)> mo2>=> haRegex.search(>'Ha'>)>=>=> None> print>(mo2)>

>

>

Produzione:

True>

Operatore facoltativo o punto interrogativo (?) nell'espressione regolare

A volte c'è un modello a cui vuoi far corrispondere solo facoltativamente. Cioè, la regex dovrebbe trovare una corrispondenza indipendentemente dal fatto che quel frammento di testo sia presente o meno. IL ? Il carattere contrassegna il gruppo che lo precede come parte opzionale del modello.

Esempio 1: Qui cercheremo un modello con un modello 'Batman' o 'Batwoman'. IL (Dove)? parte dell'espressione regolare significa che il modello wo è un gruppo opzionale. La regex corrisponderà al testo che contiene zero istanze o un'istanza di wo. Questo è il motivo per cui la regex corrisponde sia a 'Batwoman' che a 'Batman'. Puoi pensare al ? come dicendo, groups Corrisponde a zero o ad uno dei gruppi che precedono questo punto interrogativo.

Se devi trovare la corrispondenza con un vero punto interrogativo, esegui l'escape con ?.

Python3




# Python program to illustrate> # optional matching> # with question mark(?)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)?man'>)> mo1>=> batRegex.search(>'The Adventures of Batman'>)> mo2>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo1.group())> print>(mo2.group())>

>

>

Produzione:

Batman Batwoman>

Zero o più pattern match con la stella

Il * (chiamato stella o asterisco) significa corrisponde a zero o più — il gruppo che precede la stella può ricorrere un numero qualsiasi di volte nel testo. Può essere completamente assente o ripetuto più e più volte. Se è necessario trovare la corrispondenza con un vero carattere asterisco, anteporre all'asterisco nell'espressione regolare una barra rovesciata, *.

Esempio 1: In questo esempio, corrisponderemo alle zero occorrenze di un modello nella stringa. La parte (wo)* della regex corrisponde a zero istanze di wo nella stringa.

Python3




# Python program to illustrate> # matching a regular expression> # with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo1>=> batRegex.search(>'The Adventures of Batman'>)> print>(mo1.group())>

>

>

Produzione:

Batman>

Esempio 2: In questo esempio, corrisponderemo ad almeno un'occorrenza di un modello nella stringa.

Pitone




#python program to illustrate> #matching a regular expression> #with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo2>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo2.group())>

>

>

come dereferenziare un puntatore in c

Produzione:

Batwoman>

Esempio 3: In questo esempio, corrisponderemo a più di una occorrenza di un modello nella stringa.

Pitone




# Python program to illustrate> # matching a regular expression> # with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo3>=> batRegex.search(>'The Adventures of Batwowowowoman'>)> print>(mo3.group())>

>

>

Produzione:

Batwowowowoman>

Uno o più modelli corrispondenti con il Plus

Mentre * significa corrisponde a zero o più , il + (o più) significa abbinarne uno o più. A differenza dell'asterisco, che non richiede che il suo gruppo appaia nella stringa abbinata, il gruppo che precede il segno più deve apparire almeno una volta. Non è facoltativo. Se è necessario trovare la corrispondenza con un carattere di segno più effettivo, anteporre al segno più una barra rovesciata per evitarlo: +.

Esempio 1: In questo esempio, corrisponderemo ad almeno un'occorrenza di un modello nella stringa.

Python3




# Python program to illustrate> # matching a regular expression> # with plus(+)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)+man'>)> mo1>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo1.group())>

>

>

Produzione:

Batwoman>

Esempio 2: In questo esempio, l'espressione regolare Bat(wo)+man non corrisponderà alla stringa 'Le avventure di Batman' perché è richiesto almeno un wo dal segno più.

alfabeto in numeri

Pitone




# Python program to illustrate> # matching a regular expression> # with plus(+)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)+man'>)> mo3>=> batRegex.search(>'The Adventures of Batman'>)>=>=> None> print>(mo3)>

>

>

Produzione:

True>

Articolo correlato Cheetsheet Regex