re – Säännöllisten lausekkeiden operaatiot¶

Säännöllisten lausekkeiden syntaksi¶

Säännöllinen lauseke (tai RE) määrittää joukon merkkijonoja, jotka täsmäävät siihen; tämän moduulin funktioiden avulla voit tarkistaa, täsmääkö tietty merkkijono tiettyynsäännölliseen lausekkeeseen (tai täsmääkö tietty säännöllinen lauseke tiettyynmerkkijonoon, mikä on sama asia).

Säännöllisiä lausekkeita voidaan ketjuttaa muodostamaan uusia säännöllisiä lausekkeita; jos A ja B ovat molemmat säännöllisiä lausekkeita, myös AB on säännöllinen lauseke.Yleisesti ottaen, jos merkkijono p vastaa A:ta ja toinen merkkijono q vastaa B:tä, merkkijono pq vastaa AB:tä. Tämä pätee, ellei A tai B sisällä matalan etusijajärjestyksen operaatioita, ellei A:n ja B:n välillä ole reunaehtoja tai ellei niissä ole numeroituja ryhmäviittauksia. Monimutkaiset lausekkeet voidaan siis helposti muodostaa yksinkertaisemmista alkulausekkeista, kuten tässä kuvatut lausekkeet. Säännöllisten lausekkeiden teorian ja toteutuksen yksityiskohdat löytyvät Friedlin kirjasta tai lähes mistä tahansa kääntäjän rakentamista käsittelevästä oppikirjasta.

Seuraavassa on lyhyt selitys säännöllisten lausekkeiden muodosta. Lisätietoja ja lempeämmän esitystavan saat Regular Expression HOWTO:sta.

Säännölliset lausekkeet voivat sisältää sekä erikoismerkkejä että tavallisia merkkejä. Tavallisimmat tavalliset merkit, kuten 'A', 'a' tai '0', ovat yksinkertaisimpia säännönmukaisia lausekkeita; ne yksinkertaisesti vastaavat itseään. Voit ketjuttaa tavallisia merkkejä, joten last vastaa merkkijonoa 'last'. (Loppuosassa kirjoitamme RE:t this special style, yleensä ilman lainausmerkkejä, ja sovitettavat merkkijonot 'in single quotes'.)

Jotkut merkit, kuten '|' tai '(', ovat erikoismerkkejä. Erikoismerkit joko edustavat tavallisten merkkien luokkia tai vaikuttavat siihen, miten niitä ympäröiviä säännöllisiä lausekkeita tulkitaan.

Kertauslausekkeet (*, +, ?, {m,n} jne.) eivät voi olla epäsuorasti sisäkkäisiä. Näin vältetään epäselvyyksiä ei-vihreän modifikaattorin suffiksin? ja muiden modifikaattorien kanssa muissa toteutuksissa. Toisen toiston soveltamiseksi sisäiseen toistoon voidaan käyttää sulkuja. Esimerkiksi lauseke (?:a{6})* vastaa mitä tahansa kuuden 'a'-merkin monikertaa.

Erikoismerkit ovat:

.

(piste.) Oletustilassa tämä vastaa mitä tahansa merkkiä paitsi rivinvaihtoa. Jos DOTALL-merkki on määritetty, tämä vastaa mitä tahansa merkkiä, myös uutta riviä.

^

(Caret.) Sopii merkkijonon alkuun, ja MULTILINE-tilassa myös heti jokaisen uuden rivin jälkeen.

$

Sopii merkkijonon loppuun tai juuri ennen uutta riviä merkkijonon lopussa, ja MULTILINE-tilassa myös ennen uutta riviä. footoistaa sekä ’foo’ että ’foobar’, kun taas säännöllinen lauseke foo$toistaa vain ’foo’. Vielä mielenkiintoisempaa on, että foo.$:n etsiminen 'foo1\nfoo2\n':sta vastaa normaalisti ’foo2’ta, mutta MULTILINE-tilassa ’foo1’ta’; yksittäisen $:n etsiminen 'foo\n':sta löytää kaksi (tyhjää) osumaa: yhden juuri ennen uutta riviä ja yhden merkkijonon lopussa.

*

Saattaa tuloksena olevan säännöllisen säännöllisen lausekkeen täsmäämään 0:aan tai useampaan edellisen säännöllisen lausekkeen toistoon, niin moneen toistoon kuin on mahdollista. ab* vastaa ’a’, ’ab’ tai ’a’, jota seuraa mikä tahansa määrä ’b’-merkkejä.

+

Saattaa tuloksena syntyvän RE:n vastaamaan yhtä tai useampaa edellisen RE:n toistoa.ab+ vastaa ’a’-merkkiä, jota seuraa mikä tahansa nollasta poikkeava määrä ’b’-merkkejä; se ei vastaa pelkkää ’a’-merkkiä.

?

Saattaa tuloksena syntyvän RE:n vastaamaan 0 tai 1 edellisen RE:n toistoa.ab? vastaa joko ’a’ta tai ’ab’ta.

*?,+?,??

'*'-, '+'– ja '?'-määritteet ovat kaikki ahneita; ne vastaavat mahdollisimman paljon tekstiä. Joskus tätä käyttäytymistä ei haluta; jos RE<.*> sovitetaan yhteen '<a> b <c>':n kanssa, se sovittaa koko merkkijonon eikä vain '<a>':ää. Lisäämällä ? karsintamerkin perään se suorittaa täsmäämisen ei ahneella tai minimaalisella tavalla; niin vähän merkkejä kuin mahdollista täsmää. Käyttämällä RE <.*?> sovitetaan vain '<a>'.

{m}

Määrittää, että täsmälleen m kopiota edellisestä RE:stä sovitetaan; muutama merkki aiheuttaa sen, että koko RE ei sovi. Esimerkiksi a{6} vastaa täsmälleen kuutta 'a'-merkkiä, mutta ei viittä.

{m,n}

Saattaa tuloksena syntyvän RE:n vastaamaan m:stä n:ään edellisen RE:n toistoa yrittäen sovittaa mahdollisimman monta toistoa. Esimerkiksi a{3,5} vastaa 3-5 'a'-merkkiä. Jos m jätetään pois, alaraja on nolla, ja jos n jätetään pois, yläraja on ääretön. Esimerkkinä a{4,}b vastaa 'aaaab' tai tuhat 'a'-merkkiä, joita seuraa 'b', mutta ei 'aaab'. Pilkkua ei saa jättää pois, sillä muuten muokkaaja sekoittuisi aiemmin kuvattuun muotoon.

{m,n}?

Saattaa tuloksena syntyvän RE:n sovittamaan m:stä n:ään edellisenRE:n toistoa yrittäen sovittaa mahdollisimman vähän toistoja. Tämä on edellistä karsivampi versio edellisestä määritteestä. Esimerkiksi 6-merkkisessä merkkijonossa 'aaaaaa' a{3,5} vastaa 5 'a'-merkkiä, kun taas a{3,5}? vastaa vain 3 merkkiä.

\

Joko väistää erikoismerkkejä (jolloin voit sovittaa merkkejä, kuten '*', '?' ja niin edelleen) tai ilmoittaa erikoisjaksosta; erikoisjaksoja käsitellään jäljempänä.

Jos et käytä raakaa merkkijonoa kuvion ilmaisemiseen, muista, että Python käyttää myös backslash-merkkiä pakosekvenssinä merkkijonojen literaaleissa; jos Pythonin jäsentäjä ei tunnista pakosekvenssiä, backslash-merkki ja sitä seuraava merkki sisällytetään tuloksena olevaan merkkijonoon. Jos Python kuitenkin tunnistaisi tuloksena olevan sekvenssin, backslash olisi toistettava kahdesti. Tämä on monimutkaista ja vaikeasti ymmärrettävää, joten on erittäin suositeltavaa, että käytätte merkkijonoja kaikissa muissa kuin yksinkertaisimmissa lausekkeissa.

Käytetään osoittamaan merkkijonoa. Joukossa:

  • Merkit voidaan luetella yksitellen, esimerkiksi vastaa 'a','m' tai 'k'.

  • Merkkien alueet voidaan ilmoittaa antamalla kaksi merkkiä ja erottamalla ne toisistaan '-':llä, esimerkiksi vastaa mitä tahansa pientä ASCII-kirjainta, vastaa kaikkia kaksinumeroisia numeroita 00:sta 59:iin ja vastaa mitä tahansa heksadesimaalilukua. Jos - on escaped (esim.) tai jos se on sijoitettu ensimmäiseksi tai viimeiseksi merkiksi(esim. tai ), se vastaa kirjaimellista '-'.

  • Erikoismerkit menettävät erikoismerkkinsä sarjojen sisällä. Esimerkiksi vastaa mitä tahansa kirjaimellista merkkiä '(', '+','*' tai ')'.

  • Merkkiluokat, kuten \w tai \S (määritelty jäljempänä), hyväksytään myösjoukon sisäpuolella, vaikkakin merkit, joita ne vastaavat, riippuvat siitä, onko ASCII– vai LOCALE-tila voimassa.

  • Merkkejä, jotka eivät kuulu alueeseen, voidaan sovittaa täydentämällä joukkoa. Jos joukon ensimmäinen merkki on '^', kaikki merkit, jotka eivät kuulu joukkoon, sovitetaan yhteen. Esimerkiksi vastaa kaikkia merkkejä paitsi '5', ja vastaa kaikkia merkkejä paitsi '^'. ^:llä ei ole erityistä merkitystä, jos se ei ole joukon ensimmäinen merkki.

  • Voidaksesi sovittaa kirjaimellisen ']':n joukon sisällä, aseta sen eteen backslash tai aseta se joukon alkuun. Esimerkiksi sekä {}] että () sopivat molemmat sulkuihin.

  • Sisäkkäisten joukkojen ja joukko-operaatioiden tuki, kuten Unicode TechnicalStandardissa #18, saatetaan lisätä tulevaisuudessa. Tämä muuttaisi syntaksia, joten muutoksen helpottamiseksi epäselvissä tapauksissa nostetaan toistaiseksi FutureWarning.Tämä koskee myös sarjoja, jotka alkavat kirjaimella '.

    (...)

    Vastaa minkä tahansa säännöllisen lausekkeen, joka on sulkujen sisällä, ja ilmaisee ryhmän alun ja lopun; ryhmän sisältö voidaan hakea sen jälkeen, kun vastaavuus on suoritettu, ja sitä voidaan hakea merkkijonon myöhemmässä vaiheessa \numbererikoissekvenssillä, joka on kuvattu jäljempänä. Jos haluat sovittaa kirjaimia '(' tai ')',käytä \( tai \) tai sulje ne merkkiluokan sisään: , .

    (?...)

    Tämä on laajennettu merkintätapa ('(':n jälkeen tuleva '?' ei ole muuten mielekäs). Ensimmäinen merkki '?':n jälkeen määrää konstruktion merkityksen ja jatkosyntaksin. Laajennukset eivät yleensä luo uutta ryhmää; (?P<name>...) on ainoa poikkeus tähän sääntöön. Seuraavassa ovat tällä hetkellä tuetut laajennukset.

    (?aiLmsux)

    (Yksi tai useampi kirjain joukosta 'a', 'i', 'L', 'm','s', 'u', 'x'). Ryhmä vastaa tyhjää merkkijonoa; kirjaimet asettavat vastaavat liput: re.A (vain ASCII-täsmäys),re.I (ei huomioi isoja ja pieniä kirjaimia), re.L (paikasta riippuvainen),re.M (monirivinen), re.S (pisteen täsmäys),re.U (Unicode-täsmäys) ja re.X (verbaalinen),koko säännönmukaisen lausekkeen osalta.(Liput on kuvattu Moduulin sisällysluettelossa.) Tämä on hyödyllistä, jos haluat sisällyttää liput osaksi säännönmukaista lauseketta sen sijaan, että antaisit lippuargumentin funktiollere.compile(). Liput tulisi käyttää ensimmäisenä lausekkeen merkkijonossa.

    (?:...)

    Säännöllisen sulkujen sieppaamaton versio. Täsmäyttää minkä tahansa säännönmukaisen lausekkeen, joka on sulkujen sisällä, mutta ryhmän täsmäyttämää osajonoa ei voida hakea täsmäytyksen suorittamisen jälkeen tai siihen ei voida viitata myöhemmin mallissa.

    (?aiLmsux-imsx:...)

    (Nolla tai useampi kirjain joukosta 'a', 'i', 'L', 'm','s', 'u', 'x', jota seuraa mahdollisesti '-', jota seuraa yksi tai useampi kirjain joukosta 'i', 'm', 's', 'x'.)Kirjaimet asettavat tai poistavat vastaavat lipukkeet:re.A (vain ASCII-täsmäys), re.I (ei huomioi isoja ja pieniä kirjaimia),re.L (paikasta riippuvainen), re.M (monirivinen),re.S (pisteen täsmäys), re.U (Unicode-täsmäys),ja re.X (sanallinen), lausekkeen osan osalta.(Liput on kuvattu kohdassa Moduulin sisältö.)

    Kirjaimet 'a', 'L' ja 'u' ovat toisensa poissulkevia, kun niitä käytetään rivin sisäisinä lipuina, joten niitä ei voi yhdistää tai seurata '-':n jälkeen. Sen sijaan, kun jokin niistä esiintyy riviryhmässä, se ohittaa ympäröivässä ryhmässä olevan sovitusmuodon. Unicode-kuvioissa (?a:...) vaihtaa vainASCII-sovittamiseen ja (?u:...) vaihtaa Unicode-sovittamiseen (oletus). Tavukuvioissa (?L:...) vaihtaa paikasta riippuvaan täsmäämiseen ja (?a:...) vaihtaa vain ASCII-muotoiseen täsmäämiseen (oletus).Tämä ohitus on voimassa vain kapeassa riviryhmässä, ja alkuperäinen täsmäämistapa palautetaan ryhmän ulkopuolelle.

    Uusi versiossa 3.6.

    Muutettu versiossa 3.7: Ryhmässä voidaan käyttää myös kirjaimia 'a', 'L' ja 'u'.

    (?P<name>...)

    Samankaltainen kuin tavallisissa sulkeissa, mutta ryhmän täsmäyttämään osajonoon pääsee käsiksi symbolisen ryhmänimen nimen kautta. Ryhmänimien on oltava kelvollisiaPython-tunnisteita, ja kukin ryhmänimi on määriteltävä vain kerran säännönmukaisessa lausekkeessa. Symbolinen ryhmä on myös numeroitu ryhmä, aivan kuten jos ryhmää ei olisi nimetty.

    Nimettyihin ryhmiin voidaan viitata kolmessa yhteydessä. Jos kuvio on (?P<quote>).*?(?P=quote) (ts. vastaa merkkijonoa, joka on lainattu joko yksinkertaisilla tai kaksinkertaisilla lainausmerkeillä):

    Viittauskonteksti ryhmään ”lainaus”

    Viittauskonteksti ryhmään ”lainaus”

    samassa kuviossa itsessään

      .

    • (?P=quote) (kuten kuvassa)

    käsittelyssä otteluobjekti m

    • m.group('quote')

    • m.end('quote') (jne.)

    tässä merkkijonossa, joka välitetään replargumenttiin re.sub()

    • \g<quote>

    • .

    • \g<1>

    (?P=name)

    Takaviittaus nimettyyn ryhmään; se vastaa mitä tahansa tekstiä, jota aiempi ryhmä nimetty nimi vastasi.

    (?#...)

    Kommentti; sulkujen sisältö jätetään yksinkertaisesti huomioimatta.

    (?=...)

    Vastaa, jos ... vastaa seuraavaa, mutta ei kuluta mitään merkkijonosta. Tätä kutsutaan lookahead-vakuutukseksi. Esimerkiksi Isaac (?=Asimov) täsmää'Isaac ' vain, jos sitä seuraa 'Asimov'.

    (?!...)

    Matches if ... does not match next. Tämä on negatiivinen lookahead-vakuutus. esimerkiksi Isaac (?!Asimov) vastaa 'Isaac ' vain, jos sitä ei seuraa 'Asimov'.

    (?<=...)

    Vastaa, jos merkkijonon nykyistä kohtaa edeltää ...:n vastaavuus, joka päättyy nykyiseen kohtaan. Tätä kutsutaan positiiviseksi lookbehind-lausekkeeksi. (?<=abc)def löytää osuman 'abcdef':stä, koska lookbehind peruuttaa kolme merkkiä taaksepäin ja tarkistaa, täsmääkö siihen sisältyvä kuvio.Sisältyvän kuvion on täsmättävä vain tietyn pituisiin merkkijonoihin, mikä tarkoittaa, että abc tai a|b ovat sallittuja, mutta a* ja a{3,4} eivät ole. Huomaa, että positiivisilla lookbehind-lausekkeilla alkavat kuviot eivät täsmää etsittävän merkkijonon alussa; haluat todennäköisesti käyttää search()-funktiota match()-funktion sijaan:

    >>> import re>>> m = re.search('(?<=abc)def', 'abcdef')>>> m.group(0)'def'

    Tässä esimerkissä etsitään väliviivan jälkeistä sanaa:

    >>> m = re.search(r'(?<=-)\w+', 'spam-egg')>>> m.group(0)'egg'
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Muuttunut versioon 3.5: Lisätty tuki kiinteän pituisille ryhmäviittauksille.

    (?<!...)

    Vastaa, jos merkkijonon nykyistä kohtaa ei edeltää vastaavuus .... Tätä kutsutaan negatiiviseksi lookbehind-väitteeksi. Samoin kuin positiivisissa lookbehind-lausekkeissa, sisältämän kuvion on vastattava vain tietyn pituisia merkkijonoja. Kuviot, jotka alkavat negatiivisilla lookbehind-lausekkeilla, voivatsoveltua etsittävän merkkijonon alkuun.

    (?(id/name)yes-pattern|no-pattern)

    Yritetään sovittaa yes-pattern:n kanssa, jos ryhmä, jolla on annettu id tai nimi, on olemassa, ja no-pattern:n kanssa, jos se ei ole olemassa. no-pattern onvalinnainen ja voidaan jättää pois. Esimerkiksi (<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$) on huono sähköpostin täsmäytysmalli, joka täsmää '<[email protected]>':n sekä '[email protected]':n kanssa, mutta ei '<[email protected]':n eikä '[email protected]>':n kanssa.

    Erikoissekvenssit koostuvat '\':stä ja merkistä alla olevasta luettelosta.Jos tavallinen merkki ei ole ASCII-numero tai ASCII-kirjain, RE täsmää toisen merkin kanssa. Esimerkiksi $ vastaa merkkiä '$'.

    \number

    Vastaa saman numeron ryhmän sisällön. Ryhmät numeroidaan alkaen numerosta 1. Esimerkiksi (.+) vastaa 'the the' tai '55 55', mutta ei 'thethe' (huomaa välilyönti ryhmän jälkeen). Tätä erikoissekvenssiävoidaan käyttää vain johonkin ensimmäisistä 99 ryhmästä. Jos numeron ensimmäinen numero on 0 tai numero on 3 oktaalinumeroa pitkä, sitä ei tulkita ryhmätulokseksi vaan merkiksi, jonka oktaaliarvo on numero. Merkkiluokan'' sisällä kaikkia numeerisia väistämismerkkejä käsitellään merkkeinä.

    \A

    Ottaa vain merkkijonon alussa.

    \b

    Ottaa tyhjän merkkijonon, mutta vain sanan alussa tai lopussa.Sana määritellään sanamerkkien sarjana. Huomaa, että muodollisesti \b määritellään \w– ja \W-merkin väliseksi rajaksi (tai päinvastoin) tai \w:n ja merkkijonon alun/lopun väliseksi rajaksi.Tämä tarkoittaa, että r'\bfoo\b' vastaa 'foo', 'foo.', '(foo)','bar foo baz' mutta ei 'foobar' tai 'foo3'.

    Oletusarvoisesti Unicode-kuvioissa käytetään Unicode-aakkosnumeerisia merkkejä, mutta tämä voidaan muuttaa käyttämällä ASCII-merkkiä. Sanojen rajat määräytyvät nykyisen lokaalin mukaan, jos käytetään LOCALE-lippua.Merkkialueen sisällä \b edustaa backspace-merkkiä, jotta se olisi yhteensopiva Pythonin merkkijonojen kanssa.

    \B

    Sovittaa tyhjän merkkijonon, mutta vain silloin, kun se ei ole sanan alussa tai lopussa. Tämä tarkoittaa, että r'py\B' vastaa 'python', 'py3','py2', mutta ei 'py', 'py.' tai 'py!'.\B on juuri päinvastainen kuin \b, joten sanamerkit Unicodemalleissa ovat Unicoden aakkosnumeerisia merkkejä tai alaviivaa, vaikkakin tämä voidaan muuttaa käyttämällä ASCII-merkkiä. Sanarajat määräytyvät nykyisen lokaalin mukaan, jos käytetään LOCALE-lippua.

    \d Unicode (str) -kuvioille:

    Matches any Unicode decimal digit (eli mikä tahansa merkki Unicode character category ). Tämä sisältää ja myös monia muita numeromerkkejä. Jos merkkiä ASCII käytetään, vain sovitetaan.

    8-bittisille (tavu) kuvioille:

    Vastaa minkä tahansa desimaaliluvun; tämä vastaa .

    \D

    Vastaa minkä tahansa merkin, joka ei ole desimaaliluku. Tämä on \d:n vastakohta. Jos käytetään merkkiä ASCII, tästä tulee vastaava kuin .

    \s Unicode (str) -kuvioille:

    Matches Unicode whitespace characters (joka sisältää ja myös monia muita merkkejä, esimerkiksi monien kielten typografiasääntöjen määräämät välilyönnit). Jos käytetään ASCII-lippua, vain sovitetaan.

    8-bittisille (tavu) kuvioille: :tä. \S

    Vastaa minkä tahansa merkin, joka ei ole välilyönti. Tämä on \s:n vastakohta. Jos käytetään ASCII-lippua, tästä tulee vastaava kuin .

    \w Unicode (str) -kuvioille:

    Matches Unicode-sanamerkkejä; tämä sisältää useimmat merkit, jotka voivat olla osa sanaa millä tahansa kielellä, sekä numerot ja alaviivan. Jos käytetään ASCII-lippua, vain sovitetaan.

    8-bittisille (tavu) kuvioille:

    Vastaa ASCII-merkistössä aakkosnumeerisiksi katsotut merkit; tämä vastaa :tä. Jos LOCALE-merkkiä käytetään, se vastaa nykyisessä lokaalissa aakkosnumeerisiksi katsottuja merkkejä ja alaviivaa.

    \W

    Vastaa mitä tahansa merkkiä, joka ei ole sanamerkki. Tämä on \w:n vastakohta. Jos käytetään merkkiä ASCII, tästä tulee vastaava kuin . Jos käytetään LOCALE-lippua, täsmää merkkeihin, jotka eivät ole aakkosnumeerisia nykyisessä paikallistunnuksessa eivätkä alleviivausmerkkejä.

    \Z

    Maksetaan vain merkkijonon lopussa.

    Säännöllisen lausekkeen jäsentäjä hyväksyy myös useimmat Python-merkkijonojen literaalien tukemat vakiopakosekvenssit:

    \a \b \f \n\N \r \t \u\U \v \x \

    (Huomaa, että \b:tä käytetään sanojen rajojen esittämiseen, ja se tarkoittaa ”backspacea ”vain merkkiluokkien sisällä.)

    '\u', '\U' ja '\N' pakosekvenssejä tunnistetaan vain Unicodemalleissa. Tavukuvioissa ne ovat virheitä. ASCII-kirjainten tuntemattomat escapekoodit varataan tulevaa käyttöä varten ja niitä käsitellään virheinä.

    Octal escapekoodit ovat mukana rajoitetussa muodossa. Jos ensimmäinen numero on 0 tai jos oktaalilukuja on kolme, sitä pidetään oktaalipakona. Muussa tapauksessa se on ryhmäviittaus. Kuten merkkijonojen literaaleissa, oktaalipoikkeusmerkit ovat aina enintään kolmen numeron pituisia.

    Muutettu versiossa 3.3: '\u'– ja '\U'-poikkeusmerkit on lisätty.

    Muutettu versiossa 3.6: Tuntemattomat pakosekvenssit, jotka koostuvat '\' ja ASCII-kirjaimesta, ovat nyt virheitä.

    Muutettu versiossa 3.8: '\N{name}' pakosarja on lisätty. Kuten merkkijonojen literaaleissa,se laajenee nimettyyn Unicode-merkkiin (esim. '\N{EM DASH}').

Vastaa

Sähköpostiosoitettasi ei julkaista.