logo

Potrivirea modelelor în Python cu Regex

Este posibil să fiți familiarizat cu căutarea textului apăsând ctrl-F și tastând cuvintele pe care le căutați. Expresiile regulate merg cu un pas mai departe: vă permit să specificați un model de text pe care să îl căutați. În acest articol, vom vedea cum funcționează potrivirea modelelor în Python cu Regex.

Regex în Python

Expresii obisnuite , numit si regex , sunt descrieri ale unui model de text. Poate detecta prezența sau absența unui text prin potrivirea acestuia cu un anumit model și, de asemenea, poate împărți un model în unul sau mai multe submodare. De exemplu, a d într-un regex reprezintă un caracter cifră - adică orice număr între 0 și 9.

Verificați numerele de telefon folosind Regex în Python



Următorul regex este folosit în Piton pentru a potrivi un șir de trei numere, o cratimă, încă trei numere, o altă cratimă și patru numere.

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

Expresiile regulate pot fi mult mai sofisticate. De exemplu, adăugarea unui 3 între paranteze ({3}) după un model este ca și cum ai spune: Potriviți acest model de trei ori. Deci, expresia regex puțin mai scurtă este după cum urmează:

exemplu de clasă java
d{3}-d{3}-d{4}>

Se potrivește cu formatul corect al numărului de telefon.

Potrivirea modelelor cu expresii regulate

Un obiect Regex căutare() Metoda caută în șirul care i-a fost transmis orice potrivire cu expresia regex. Obiectele de potrivire au o metodă group() care va returna textul potrivit din șirul căutat. De asemenea, puteți vedeaFoaia regexpentru mai multe informatii.

Exemplu: Importă modulul regex cu import re. Creați un obiect Regex cure.compile()funcţie. (Nu uitați să utilizați un șir brut.) Treceți șirul pe care doriți să îl căutați în metoda search() a obiectului Regex. Aceasta returnează un obiect Match. Apelați metoda group() a obiectului Match pentru a returna un șir din textul potrivit.

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())>

>

>

Ieșire:

Phone number found: 415-555-4242>

Paranteze pentru gruparea și capturarea cu Regex

Una dintre modalitățile de potrivire a modelelor cu Regex este folosirea parantezelor în jurul modelelor. Să vedem câteva exemple diferite pentru o mai bună înțelegere.

Obiecte potrivite

Să presupunem că doriți să separați prefixul de restul numărului de telefon. Adăugarea de paranteze va crea grupuri în expresia regex: (ddd)-(ddd-dddd). Apoi puteți utiliza metoda obiectului potrivire group() pentru a prelua textul potrivit dintr-un singur grup.

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)>

>

>

Ieșire:

415 area code: 415 number: 555-4242>

Preluați toate grupurile simultan

Dacă doriți să preluați toate grupurile simultan, utilizați metoda groups(), - notați forma de plural pentru nume.

Python3




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

>

>

Ieșire:

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

Potriviți o paranteză

Parantezele au o semnificație specială în expresiile regulate, dar ce faci dacă trebuie să potriviți o paranteză în text. De exemplu, poate numerele de telefon cu care încercați să le potriviți au prefixul setat în paranteze. În acest caz, trebuie să scăpați de caracterele ( și ) cu o bară oblică inversă. Introduceți următoarele în shell-ul interactiv:

Python3

compara cu string




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

>

>

Ieșire:

(415)>

Caracterele de escape ( și ) din șirul brut transmis către re.compile() se vor potrivi cu caracterele reale din paranteză.

Expresii regulate: gruparea și caracterul pipe

The | caracterul se numește țeavă. Îl putem folosi oriunde dorim pentru a potrivi una dintre multele expresii.

Exemplu: Expresia regulată r’Batman|Tina Fey’ se va potrivi fie cu „Batman”, fie cu „Tina Fey”. Când atât Batman, cât și Tina Fey apar în șirul căutat, prima apariție a textului potrivit va fi returnată ca obiect 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())>

>

>

Ieșire:

'Batman'>

Înțelegerea bretelelor în Regex

Dacă avem un grup pe care dorim să-l repetăm ​​de un anumit număr de ori, urmați grupul în regex cu un număr între paranteze.

De exemplu, expresia regex (Ha){3} se va potrivi cu șirul „HaHaHa”, dar nu se va potrivi cu „HaHa”, deoarece acesta din urmă are doar două repetări ale grupului (Ha). În loc de doar un număr, puteți specifica un interval între paranteze. Regex (Ha){3, 5} se va potrivi cu „HaHaHa”, „HaHaHaHa” și „HaHaHaHaHa”. Puteți, de asemenea, să omiteți primul sau al doilea număr din paranteze pentru a lăsa minimul sau maximul nemărginit. (Ha){3, } se va potrivi cu trei sau mai multe instanțe ale grupului (Ha), în timp ce (Ha){, 5} va potrivi între zero și cinci instanțe. Parantezele vă pot ajuta să vă scurtați expresiile obișnuite.

Exemplul 1: În acest exemplu, vom folosi paranteze pentru a specifica apariția modelului pe care îl căutăm.

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())>

>

>

Ieșire:

HaHaHa>

Exemplul 2: În acest exemplu, vom defini apariția modelului folosind paranteze și apoi vom căuta dacă un model specific există sau nu în el.

Python3


nici un semnal de intrare



# 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)>

>

>

Ieșire:

True>

Operator opțional sau semn de întrebare (?) în expresie regulată

Uneori există un model pe care doriți să-l potriviți doar opțional. Adică, expresia regex ar trebui să găsească o potrivire indiferent dacă acel fragment de text este sau nu acolo. The ? caracterul semnalează grupul care îl precede ca parte opțională a modelului.

Exemplul 1: Aici, vom căuta un model cu un model „Batman” sau „Batwoman”. The (Unde)? o parte a expresiei regulate înseamnă că modelul wo este un grup opțional. Regex-ul va potrivi textul care are zero instanțe sau o instanță de wo în el. Acesta este motivul pentru care expresia regex se potrivește atât cu „Batwoman” cât și cu „Batman”. Te poți gândi la? cum spunea, grupuri Potriviți zero sau unul din grupul care precede acest semn de întrebare.

Dacă trebuie să potriviți un semn de întrebare real, evadați-l cu ?.

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())>

>

>

Ieșire:

Batman Batwoman>

Zero sau mai multe modele care se potrivesc cu steaua

* (numit stea sau asterisc) înseamnă potrivi zero sau mai mult — grupul care precede steaua poate apărea de orice număr de ori în text. Poate fi complet absent sau repetat iar și iar. Dacă trebuie să potriviți un caracter stea real, prefixați steaua în expresia regulată cu o bară oblică inversă, *.

Exemplul 1: În acest exemplu, vom potrivi cu zero aparițiile unui model din șir. Partea (wo)* a expresiei regex se potrivește cu zero instanțe de wo în șir.

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())>

>

>

Ieșire:

Batman>

Exemplul 2: În acest exemplu, vom potrivi cel puțin o apariție a unui model în șir.

Piton




#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())>

>

ce colecție în java

>

Ieșire:

Batwoman>

Exemplul 3: În acest exemplu, vom potrivi mai mult de o apariție a unui model în șir.

Piton




# 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())>

>

>

Ieșire:

Batwowowowoman>

Potrivirea unuia sau mai multor modele cu Plus

In timp ce * mijloace potrivi zero sau mai mult , + (sau plus) înseamnă se potrivesc cu una sau mai multe. Spre deosebire de steluță, care nu necesită ca grupul său să apară în șirul potrivit, grupul care precede un plus trebuie să apară cel puțin o dată. Nu este optional. Dacă trebuie să potriviți un caracter semnul plus real, prefixați semnul plus cu o bară oblică inversă pentru a-l scăpa: +.

Exemplul 1: În acest exemplu, vom potrivi cel puțin o apariție a unui model în șir.

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())>

>

>

Ieșire:

Batwoman>

Exemplul 2: În acest exemplu, expresia regex Bat(wo)+man nu se va potrivi cu șirul „The Adventures of Batman”, deoarece cel puțin un wo este cerut de semnul plus.

algoritmi de căutare binară

Piton




# 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)>

>

>

Ieșire:

True>

Articol înrudit Foaia de gheață Regex