logo

Pythonin kuvioiden täsmäys Regexin kanssa

Saatat tuntea tekstin etsimisen painamalla ctrl-F ja kirjoittamalla etsimäsi sanat. Säännölliset lausekkeet menevät askeleen pidemmälle: Niiden avulla voit määrittää haettavan tekstin kuvion. Tässä artikkelissa näemme, kuinka Pythonin kuvioiden täsmäys toimii Regexin kanssa.

Regex Pythonissa

Säännölliset lausekkeet , kutsutaan myös regex , ovat kuvauksia tekstimallista. Se voi havaita tekstin olemassaolon tai puuttumisen yhdistämällä sen tiettyyn kuvioon ja voi myös jakaa kuvion yhdeksi tai useaksi alakuvioksi. Esimerkiksi a d säännöllisessä lausekkeessa tarkoittaa numeromerkkiä eli mitä tahansa yksittäistä numeroa välillä 0 ja 9.



Tarkista puhelinnumerot Regexillä Pythonissa

Seuraavaa regexiä käytetään Python vastaamaan kolmen numeron merkkijonoa, yhdysviivaa, kolme muuta numeroa, toinen yhdysmerkki ja neljä numeroa.

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

Säännölliset lausekkeet voivat olla paljon kehittyneempiä. Esimerkiksi 3:n lisääminen hakasulkeisiin ({3}) kuvion jälkeen on kuin sanoisi: Yhdistä tämä kuvio kolme kertaa. Joten hieman lyhyempi regex on seuraava:



iteroida kartta javan kautta
d{3}-d{3}-d{4}>

Se vastaa oikeaa puhelinnumeromuotoa.

Kuvioiden sovitus säännöllisillä lausekkeilla

Regex-objekti Hae() menetelmä etsii välitetystä merkkijonosta mahdollisia osumia säännölliseen lausekkeeseen. Match-objekteilla on group()-metodi, joka palauttaa todellisen osuvan tekstin hatusta merkkijonosta. Voit myös nähdäRegex cheetsheetLisätietoja.

Esimerkki: Tuo regex-moduuli Import re -toiminnolla. Luo Regex-objektire.compile()toiminto. (Muista käyttää raakamerkkijonoa.) Ohjaa haettava merkkijono Regex-objektin search()-metodiin. Tämä palauttaa Match-objektin. Kutsu Match-objektin group()-metodi palauttaaksesi todellisen osuvan tekstin merkkijonon.



Python 3




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

>

>

Lähtö:

Phone number found: 415-555-4242>

Sulut ryhmittelyyn ja kaappaamiseen Regexin avulla

Yksi tapa sovittaa kuvioita Regexin kanssa on käyttää kuvioiden ympärillä sulkumerkkejä. Katsotaanpa muutama eri esimerkki ymmärtääksemme paremmin.

Vastaavat objektit

Oletetaan, että haluat erottaa suuntanumeron muusta puhelinnumerosta. Sulujen lisääminen luo ryhmiä säännölliseen lausekkeeseen: (ddd)-(ddd-dddd). Sitten voit käyttää group() match object -menetelmää nappataksesi vastaavan tekstin vain yhdestä ryhmästä.

Python 3




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

>

>

Lähtö:

415 area code: 415 number: 555-4242>

Hae kaikki ryhmät kerralla

Jos haluat hakea kaikki ryhmät kerralla, käytä ryhmät(), -metodia – huomioi nimen monikkomuoto.

Python 3




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

>

>

Lähtö:

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

Yhdistä sulkumerkki

Suluilla on erityinen merkitys säännöllisissä lausekkeissa, mutta mitä teet, jos sinun on löydettävä tekstisi sulkumerkki. Esimerkiksi puhelinnumeroiden, joita yrität yhdistää, suuntanumero on asetettu suluissa. Tässä tapauksessa sinun on poistettava ( ja ) -merkit kenoviivalla. Kirjoita interaktiiviseen kuoreen seuraava:

Python 3




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

>

>

Lähtö:

(415)>

Re.compile():lle välitetyn raakamerkkijonon ( ja ) escape-merkit vastaavat todellisia sulkumerkkejä.

Säännölliset lausekkeet: ryhmittely ja putkimerkki

The | hahmoa kutsutaan putkeksi. Voimme käyttää sitä missä tahansa, missä haluamme vastata johonkin monista ilmauksista.

merkki merkkijonoon java

Esimerkki: Säännöllinen lauseke r'Batman|Tina Fey' vastaa joko 'Batman' tai 'Tina Fey'. Kun sekä Batman että Tina Fey esiintyvät haetussa merkkijonossa, ensimmäinen vastaavan tekstin esiintyminen palautetaan Match-objektina.

Python 3




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

>

>

Lähtö:

'Batman'>

Kiharahousun ymmärtäminen Regexissä

Jos meillä on ryhmä, jonka haluamme toistaa tietyn määrän kertoja, seuraa ryhmää säännöllisessä lauseessa numerolla hakasulkeissa.

Esimerkiksi säännöllinen lauseke (Ha){3} vastaa merkkijonoa 'HaHaHa', mutta se ei vastaa sanaa 'HaHa', koska jälkimmäisessä on vain kaksi (Ha)-ryhmän toistoa. Vain yhden numeron sijasta voit määrittää alueen kiharoiden hakasulkeiden väliin. Säännöllinen lauseke (Ha){3, 5} vastaa sanaa 'HaHaHa', 'HaHaHaHa' ja 'HaHaHaHaHa'. Voit myös jättää ensimmäisen tai toisen numeron pois kiharahakasulkeista jättääksesi minimi- tai enimmäisluvun rajoittamatta. (Ha){3, } vastaa kolmea tai useampaa (Ha)-ryhmän esiintymää, kun taas (Ha){, 5} vastaa nollasta viiteen esiintymää. Kaarevat hakasulkeet voivat auttaa lyhentämään säännöllisiä lausekkeita.

Esimerkki 1: Tässä esimerkissä käytämme kiharahakasulkeita määrittääksemme etsimämme kuvion esiintymisen.

Python 3




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

>

>

Lähtö:

HaHaHa>

Esimerkki 2: Tässä esimerkissä määritämme kuvion esiintymisen kiharasulkeilla ja etsimme sitten, onko siinä tietty kuvio vai ei.

Python 3




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

>

>

Lähtö:

True>

Valinnainen operaattori tai kysymysmerkki (?) säännöllisessä lausekkeessa

Joskus on kuvio, jota haluat yhdistää vain valinnaisesti. Toisin sanoen säännöllisen lausekkeen pitäisi löytää vastaavuus riippumatta siitä, onko kyseinen osa tekstiä siellä. The ? merkki merkitsee sitä edeltävän ryhmän valinnaiseksi osaksi kuviota.

Esimerkki 1: Täällä etsimme mallia, jonka kuvio on 'Batman' tai 'Batwoman'. The (missä)? säännöllisen lausekkeen osa tarkoittaa, että kuvio wo on valinnainen ryhmä. Regex vastaa tekstiä, jossa on nolla esiintymää tai yksi esiintymä wo. Tästä syystä säännöllinen lauseke vastaa sekä 'Batwoman' että 'Batman'. Voitko ajatella ? kuten sanotaan, ryhmät Vastaa nollaa tai yhtä tätä kysymysmerkkiä edeltävästä ryhmästä.

Jos sinun on löydettävä varsinainen kysymysmerkki, ohita se merkillä ?.

Python 3


kuinka poistaa sarake postgresqlissa



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

>

>

Lähtö:

matriisi, joka lisää elementtejä java
Batman Batwoman>

Nolla tai useampi kuvio täsmää tähdellä

* (kutsutaan tähdeksi tai tähdeksi) tarkoittaa vastaa nollaa tai enemmän — tähteä edeltävä ryhmä voi esiintyä tekstissä kuinka monta kertaa tahansa. Se voi olla kokonaan poissa tai toistua yhä uudelleen ja uudelleen. Jos haluat vastata todellista tähtimerkkiä, liitä tähti säännölliseen lausekkeeseen kenoviivalla *.

Esimerkki 1: Tässä esimerkissä vastaamme merkkijonon kuvion nollakohtaan. Säännöllisen lausekkeen (wo)*-osa vastaa nollaa wo:n esiintymää merkkijonossa.

Python 3




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

>

>

Lähtö:

Batman>

Esimerkki 2: Tässä esimerkissä sovitamme vähintään yhden kuvion esiintymän merkkijonossa.

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

>

>

Lähtö:

Batwoman>

Esimerkki 3: Tässä esimerkissä sovitamme useamman kuin yhden kuvion esiintymän merkkijonossa.

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

>

>

Lähtö:

Batwowowowoman>

Yhden tai useamman kuvion yhteensopivuus plussan kanssa

Sillä aikaa * tarkoittaa vastaa nollaa tai enemmän , + (tai plus) tarkoittaa vastaa yhtä tai useampaa. Toisin kuin tähti, joka ei edellytä ryhmän esiintyvän täsmäytetyssä merkkijonossa, plusmerkkiä edeltävän ryhmän on oltava vähintään kerran. Se ei ole valinnainen. Jos sinun on vastattava varsinaista plusmerkkiä, liitä plusmerkin eteen kenoviiva sen välttämiseksi: +.

Esimerkki 1: Tässä esimerkissä sovitamme vähintään yhden kuvion esiintymän merkkijonossa.

Python 3




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

>

>

Lähtö:

Batwoman>

Esimerkki 2: Tässä esimerkissä säännöllinen lauseke Bat(wo)+man ei vastaa merkkijonoa 'Batmanin seikkailut', koska plusmerkki vaatii vähintään yhden wo.

binäärihakualgoritmit

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

>

>

Lähtö:

True>

Aiheeseen liittyvä artikkeli Regex Cheetsheet