logo

Ujemanje vzorcev v Pythonu z Regexom

Morda poznate iskanje besedila tako, da pritisnete ctrl-F in vnesete besede, ki jih iščete. Regularni izrazi gredo še korak dlje: omogočajo vam, da določite vzorec besedila za iskanje. V tem članku bomo videli, kako ujemanje vzorcev v Pythonu deluje z Regexom.

Regex v Pythonu

Regularni izrazi , imenovan tudi regex , so opisi vzorca besedila. Zazna lahko prisotnost ali odsotnost besedila tako, da ga poveže z določenim vzorcem, prav tako pa lahko vzorec razdeli na enega ali več podvzorcev. Na primer, a d v regularnem izrazu pomeni cifro - to je katera koli posamezna številka med 0 in 9.



Preverite telefonske številke z uporabo regularnega izraza v Pythonu

Naslednji regularni izraz se uporablja v Python da se ujema z nizom treh številk, vezajem, še tremi številkami, drugim vezajem in štirimi številkami.

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

Regularni izrazi so lahko veliko bolj izpopolnjeni. Na primer, če bi za vzorec dodali 3 v zavitih oklepajih ({3}), je to, kot da bi rekli, Trikrat ujemaj ta vzorec. Nekoliko krajši regularni izraz je torej naslednji:



kdaj se konča q1
d{3}-d{3}-d{4}>

Ujema se s pravilno obliko telefonske številke.

Ujemanje vzorcev z regularnimi izrazi

Predmet regularnega izraza Iskanje() metoda išče v nizu, ki ji je bil posredovan, morebitna ujemanja z regularnim izrazom. Objekti za ujemanje imajo metodo group(), ki vrne dejansko ujemajoče se besedilo iz iskanega niza. Lahko tudi viditeList z regularnimi izraziza več informacij.

primer: Uvozite modul regex z import re. Ustvarite objekt Regex zre.compile()funkcijo. (Ne pozabite uporabiti neobdelanega niza.) Niz, ki ga želite iskati, prenesite v metodo search() objekta Regex. To vrne predmet Match. Pokličite metodo group() objekta Match, da vrnete niz dejanskega ujemajočega se besedila.



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

>

>

Izhod:

Phone number found: 415-555-4242>

Oklepaji za združevanje in zajemanje z regularnimi izrazi

Eden od načinov ujemanja vzorcev z Regex je uporaba oklepajev okoli vzorcev. Oglejmo si nekaj različnih primerov za boljše razumevanje.

Ujemanje predmetov

Recimo, da želite ločiti območno kodo od ostale telefonske številke. Če dodate oklepaje, boste ustvarili skupine v regularnem izrazu: (ddd)-(ddd-dddd). Nato lahko uporabite metodo predmeta ujemanja group(), da zgrabite ujemajoče se besedilo iz samo ene skupine.

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

>

>

Izhod:

415 area code: 415 number: 555-4242>

Pridobite vse skupine naenkrat

Če želite pridobiti vse skupine hkrati, uporabite metodo groups() – upoštevajte množinsko obliko imena.

Python3




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

>

>

Izhod:

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

Poveži oklepaj

Oklepaji imajo poseben pomen v regularnih izrazih, toda kaj storiti, če se morate v besedilu ujemati z oklepajem. Na primer, morda imajo telefonske številke, ki jih poskušate ujemati, v oklepajih nastavljeno območno kodo. V tem primeru morate znake ( in ) ubežati s poševnico nazaj. V interaktivno lupino vnesite naslednje:

Python3


kaj je internet



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

>

>

Izhod:

(415)>

Ubežna znaka ( in ) v neobdelanem nizu, posredovanem re.compile(), se bosta ujemala z dejanskimi znaki v oklepajih.

Regularni izrazi: združevanje in cevni znak

The | znak se imenuje cev. Uporabimo ga lahko povsod, kjer želimo ujemati enega od mnogih izrazov.

primer: Regularni izraz r'Batman|Tina Fey' se bo ujemal z 'Batman' ali 'Tina Fey'. Ko se v iskanem nizu pojavita tako Batman kot Tina Fey, bo prvo pojavitev ujemajočega se besedila vrnjena kot predmet ujemanja.

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

>

>

Izhod:

'Batman'>

Razumevanje zavitih oklepajev v regularnem izrazu

Če imamo skupino, ki jo želimo ponoviti določeno število krat, skupini v regularnem izrazu sledi številka v zavitih oklepajih.

Na primer, regularni izraz (Ha){3} se bo ujemal z nizom 'HaHaHa', vendar se ne bo ujemal z 'HaHa', saj ima slednji samo dve ponovitvi skupine (Ha). Namesto samo ene številke lahko določite obseg med zavitimi oklepaji. Regularni izraz (Ha){3, 5} se bo ujemal z 'HaHaHa', 'HaHaHaHa' in 'HaHaHaHaHa'. Prav tako lahko izpustite prvo ali drugo številko v zavitih oklepajih, da najmanjša ali največja vrednost ostane neomejena. (Ha){3, } se bo ujemal s tremi ali več primerki skupine (Ha), medtem ko se bo (Ha){, 5} ujemal z nič do petimi primerki. Zavit oklepaj vam lahko pomaga skrajšati regularne izraze.

Primer 1: V tem primeru bomo uporabili zavite oklepaje, da določimo pojavnost vzorca, ki ga iščemo.

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

>

>

Izhod:

HaHaHa>

Primer 2: V tem primeru bomo določili pojavnost vzorca z zavitimi oklepaji in nato poiskali, ali določen vzorec obstaja v njem ali ne.

Python3




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

listnode java

>

>

Izhod:

True>

Izbirni operator ali vprašaj (?) v regularnem izrazu

Včasih obstaja vzorec, ki ga želite ujemati samo po želji. To pomeni, da bi moral regularni izraz najti ujemanje, ne glede na to, ali je ta košček besedila tam ali ne. The ? znak označuje skupino, ki je pred njim, kot izbirni del vzorca.

Primer 1: Tukaj bomo iskali vzorec z vzorcem 'Batman' ali 'Batwoman'. The (kje)? del regularnega izraza pomeni, da je vzorec wo neobvezna skupina. Regularni izraz se bo ujemal z besedilom, ki ima nič primerkov ali en primerek wo v sebi. Zato se regularni izraz ujema tako z »Batwoman« kot z »Batman«. Si lahko omislite? kot rečeno, skupine Ujemanje nič ali eno od skupine pred tem vprašajem.

Če se morate ujemati z dejanskim znakom vprašaja, ga ubežite z ?.

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

>

>

Izhod:

Batman Batwoman>

Nič ali več ujemanja vzorcev z zvezdo

* (imenovana zvezdica ali zvezdica) pomeni ujemanje nič ali več — skupina pred zvezdico se lahko v besedilu pojavi poljubno število krat. Lahko je popolnoma odsoten ali pa se ponavlja znova in znova. Če se morate ujemati z dejanskim znakom zvezdice, pred zvezdico v regularnem izrazu dodajte poševnico nazaj, *.

Primer 1: V tem primeru bomo ujemali ničelne pojavitve vzorca v nizu. (wo)* del regularnega izraza se ujema z nič primerki wo v nizu.

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

>

>

Izhod:

Batman>

Primer 2: V tem primeru bomo ujemali vsaj eno pojavitev vzorca v nizu.

Python




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

>

>

Izhod:

kaj pomeni xd
Batwoman>

Primer 3: V tem primeru bomo ujemali več kot eno pojavitev vzorca v nizu.

Python




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

>

>

Izhod:

Batwowowowoman>

Ujemanje enega ali več vzorcev s plusom

Medtem * pomeni ujemanje nič ali več , + (ali plus) pomeni ujemanje z enim ali več. Za razliko od zvezdice, ki ne zahteva, da se njena skupina pojavi v ujemajočem se nizu, se mora skupina pred plusom pojaviti vsaj enkrat. Ni izbirno. Če se morate ujemati z dejanskim znakom plus, dodajte pred znak plus poševnico nazaj, da se izognete: +.

Primer 1: V tem primeru bomo ujemali vsaj eno pojavitev vzorca v nizu.

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

>

>

Izhod:

Batwoman>

Primer 2: V tem primeru se regularni izraz Bat(wo)+man ne bo ujemal z nizom »The Adventures of Batman«, ker znak plus zahteva vsaj enega wo.

rimske številke 1100

Python




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

>

>

Izhod:

True>

Sorodni članek Regex Cheetsheet