re – Operații cu expresii regulate¶

Sintaxa expresiilor regulate¶

O expresie regulată (sau RE) specifică un set de șiruri de caractere care se potrivește cu ea; funcțiile din acest modul vă permit să verificați dacă un anumit șir de caractere se potrivește cu o expresie regulată dată (sau dacă o expresie regulată dată se potrivește cu un anumit șir de caractere, ceea ce se reduce la același lucru).

Expresiile regulate pot fi concatenate pentru a forma noi expresii regulate; dacă Ași B sunt ambele expresii regulate, atunci AB este, de asemenea, o expresie regulată. în general, dacă un șir p se potrivește cu A și un alt șir q se potrivește cu B, șirul pq se va potrivi cu AB. Acest lucru este valabil cu excepția cazului în care A sau B conțin operații cu precedență scăzută; condiții de limită între A și B; sau au referințe de grup numerotate. Astfel, expresiile complexe pot fi construite cu ușurință din expresii primitive mai simple precum cele descrise aici. Pentru detalii despre teoria și implementarea expresiilor regulate, consultați cartea lui Friedl ,sau aproape orice manual despre construcția compilatoarelor.

În continuare, o scurtă explicație a formatului expresiilor regulate. Pentru mai multeinformații și o prezentare mai blândă, consultați Regular Expression HOWTO.

Expresiile regulate pot conține atât caractere speciale cât și obișnuite. Caracterele cele mai obișnuite, cum ar fi 'A', 'a' sau '0', sunt cele mai simple expresii regulate; ele pur și simplu se potrivesc singure. Puteți concatena caracterele obișnuite, astfel încât last se potrivește cu șirul 'last'. (În restul acestei secțiuni, vom scrie RE în this special style, de obicei fără ghilimele, iar șirurile care trebuie să se potrivească 'in single quotes'.)

Câteva caractere, cum ar fi '|' sau '(', sunt speciale. Caracterele speciale fie reprezintă clase de caractere obișnuite, fie afectează modul în care sunt interpretate expresiile regulate din jurul lor.

Calificatorii de repetiție (*, +, ?, {m,n}, etc.) nu pot fi imbricați direct. Acest lucru evită ambiguitatea cu sufixul modificator non-greșit?, precum și cu alți modificatori din alte implementări. Pentru a aplica o a doua repetiție la o repetiție interioară, se pot folosi paranteze. De exemplu, expresia (?:a{6})* se potrivește cu orice multiplu de șase caractere 'a'.

Caracterele speciale sunt:

.

(Punct.) În modul implicit, această expresie se potrivește cu orice caracter cu excepția unei linii noi. Dacă a fost specificat steagul DOTALL, acesta se potrivește cu orice caracter, inclusiv o linie nouă.

^

(Caret.) Se potrivește cu începutul șirului, iar în modul MULTILINE se potrivește, de asemenea, imediat după fiecare linie nouă.

$

Se potrivește cu sfârșitul șirului sau chiar înainte de linia nouă de la sfârșitul șirului, iar în modul MULTILINE se potrivește, de asemenea, înainte de o linie nouă. foose potrivește atât cu „foo”, cât și cu „foobar”, în timp ce expresia regulată foo$se potrivește doar cu „foo”. Mai interesant, căutarea lui foo.$ în 'foo1\nfoo2\n'se potrivește cu „foo2” în mod normal, dar cu „foo1” în modul MULTILINE; căutarea unui singur $ în 'foo\n' va găsi două potriviri (goale): una chiar înainte de linia nouă și una la sfârșitul șirului de caractere.

*

Caută RE rezultată să se potrivească cu 0 sau mai multe repetări ale RE precedente, cât mai multe repetări posibile. ab* se va potrivi cu „a”, „ab” sau „a” urmat de orice număr de „b”.

+

Caută RE rezultat să se potrivească cu 1 sau mai multe repetiții ale RE precedent.ab+ se va potrivi cu „a” urmat de orice număr diferit de zero de „b”; nu se va potrivi doar cu „a”.

?

Caută ca RE rezultat să se potrivească cu 0 sau 1 repetiții ale RE precedent.ab? se va potrivi fie cu „a”, fie cu „ab”.

*?,+?,??

Calificatoarele '*', '+' și '?' sunt toate lacome; ele se potrivesc cu cât mai mult text posibil. Uneori, acest comportament nu este dorit; dacă RE<.*> se potrivește cu '<a> b <c>', acesta se va potrivi cu întreaga linie și nu doar cu '<a>'. Adăugarea lui ? după calificativ face ca acesta să efectueze potrivirea într-un mod neîndurător sau minimalist; se vor potrivi cât mai puține caractere posibil. Folosind RE <.*?> se va potrivi doar cu '<a>'.

{m}

Specifică faptul că exact m copii ale RE anterior trebuie să fie potrivite; mai puține caractere fac ca întregul RE să nu se potrivească. De exemplu, a{6} se va potrivi cu exact șase caractere 'a', dar nu cu cinci.

{m,n}

Caută ca RE rezultat să se potrivească cu m până la n repetări ale RE precedent, încercând să se potrivească cu cât mai multe repetări posibil. De exemplu,a{3,5} se va potrivi de la 3 la 5 caractere 'a'. Dacă se omite m se specifică o limită inferioară de zero, iar dacă se omite n se specifică o limită superioară infinită. De exemplu, a{4,}b se va potrivi cu 'aaaab' sau cu o mie de caractere 'a' urmate de un 'b', dar nu cu 'aaab'. Virgula nu poate fi omisă, altfel modificatorul ar fi confundat cu forma descrisă anterior.

{m,n}?

Caută RE rezultat să se potrivească cu m până la n repetări aleRE precedent, încercând să se potrivească cu cât mai puține repetări posibil. Aceasta este versiunea „on-greedy” a calificativului anterior. De exemplu, la șirul de 6 caractere 'aaaaaa', a{3,5} se va potrivi cu 5 caractere 'a', în timp ce a{3,5}? se va potrivi doar cu 3 caractere.

\

Fie evită caracterele speciale (permițându-vă să potriviți caractere ca'*', '?' și așa mai departe), fie semnalează o secvență specială; secvențele speciale sunt discutate mai jos.

Dacă nu folosiți un șir brut pentru a exprima modelul, amintiți-vă că Python utilizează și backslash-ul ca o secvență de evadare în literalele de șir; dacă secvența de evadare nu este recunoscută de parserul Python, backslash-ul și caracterul următor sunt incluse în șirul rezultat. Cu toate acestea, dacă Python recunoaște secvența rezultată, backslash-ul trebuie repetat de două ori. Acest lucru este complicat și greu de înțeles, așa că este foarte recomandat să folosiți șiruri de caractere pentru toate expresiile, cu excepția celor mai simple.

Utilizat pentru a indica un set de caractere. Într-un set:

  • Caracterele pot fi enumerate individual, de exemplu, se va potrivi cu 'a','m' sau 'k'.

  • Se pot indica intervale de caractere prin indicarea a două caractere și separarea lor printr-un '-', de exemplu se va potrivi cu orice literă ASCII minusculă, se va potrivi cu toate numerele de două cifre de la 00 la 59, iar se va potrivi cu orice cifră hexazecimal. Dacă - este scăpat (de exemplu, ) sau dacă este plasat ca primul sau ultimul caracter (de exemplu, sau ), se va potrivi cu un literal '-'.

  • Caracterele speciale își pierd semnificația specială în interiorul seturilor. De exemplu, se va potrivi cu oricare dintre caracterele literale '(', '+','*' sau ')'.

  • Classele de caractere cum ar fi \w sau \S (definite mai jos) sunt, de asemenea, acceptateîn interiorul unui set, deși caracterele cu care se potrivesc depind de faptul dacă este în vigoare modulASCII sau LOCALE.

  • Caracterele care nu se află într-un interval pot fi potrivite prin completarea setului. Dacă primul caracter al setului este '^', toate caracterele care nu se află în set vor fi potrivite. De exemplu, se va potrivi cu orice caracter cu excepția lui '5', iar se va potrivi cu orice caracter cu excepția lui '^'. ^ nu are nici o semnificație specială dacă nu este primul caracter din set.

  • Pentru a potrivi un literal ']' în interiorul unui set, precedați-l cu o backslash sau plasați-l la începutul setului. De exemplu, atât {}], cât și () se vor potrivi cu o paranteză.

  • În viitor ar putea fi adăugat suportul pentru seturi imbricate și operații de set ca în Unicode TechnicalStandard #18. Acest lucru ar schimba sintaxa, astfel încât, pentru a facilita această modificare, se va ridica un FutureWarning în cazurile ambigue deocamdată.Aceasta include seturile care încep cu un literal '.

    (...)

    Se potrivește cu orice expresie regulată aflată în interiorul parantezelor și indică începutul și sfârșitul unui grup; conținutul unui grup poate fi recuperat după ce a fost efectuată o potrivire și poate fi potrivit ulterior în șir cu secvența specială \number, descrisă mai jos. Pentru a potrivi literalele '(' sau ')', folosiți \( sau \), sau includeți-le într-o clasă de caractere: , .

    (?...)

    Aceasta este o notație de extensie (un '?' care urmează unui '(' nu are sens în caz contrar). Primul caracter după '?' determină care este semnificația și sintaxa ulterioară a construcției. De obicei, extensiile nu creează un nou grup; (?P<name>...) este singura excepție de la această regulă. În cele ce urmează sunt extensiile acceptate în prezent.

    (?aiLmsux)

    (Una sau mai multe litere din setul 'a', 'i', 'L', 'm','s', 'u', 'x'). Grupul se potrivește cu șirul gol; literele setează stegulețele corespunzătoare: (potrivire numai ASCII),re.I (ignoră majusculele și minusculele), re.L (depinde de localitate),re.M (mai multe linii), re.S (punctul se potrivește cu toate),re.U (potrivire Unicode) și re.X (verbose),pentru întreaga expresie regulată.(Stegulețele sunt descrise în Module Contents.)Acest lucru este util dacă doriți să includeți stegulețele ca parte a expresiei regulate, în loc să treceți un argument de steguleț la funcțiare.compile(). Semnalizatoarele trebuie folosite primele în șirul de expresii.

    (?:...)

    O versiune necapturătoare a parantezelor regulate. Se potrivește cu orice expresie regulată care se află în interiorul parantezelor, dar subșirul la care se potrivește grupul nu poate fi recuperat după efectuarea unei potriviri sau la care se face referire mai târziu în model.

    (?aiLmsux-imsx:...)

    (Zero sau mai multe litere din setul 'a', 'i', 'L', 'm', 's', 'u', 'x', urmate opțional de '-' urmat de una sau mai multe litere din setul 'i', 'm', 's', 'x'.)Literele setează sau elimină stegulețele corespunzătoare: (potrivire numai ASCII), re.I (ignoră majusculele și minusculele),re.L (depinde de localitate), re.M (mai multe linii),re.S (punctul se potrivește cu toate), re.U (potrivire Unicode) și re.X (verbose), pentru partea din expresie.(Semnalizatoarele sunt descrise în Module Contents.)

    Celebrele 'a', 'L' și 'u' se exclud reciproc atunci când sunt utilizate ca semnalizatoare în linie, astfel încât nu pot fi combinate sau să urmeze '-'. În schimb, atunci când una dintre ele apare într-un grup inline, aceasta prevalează asupra modului de potrivire din grupul înconjurător. În cazul modelelor Unicode, (?a:...) trece la potrivire numai în ASCII, iar (?u:...) trece la potrivire Unicode (implicit). În modelele de octeți, (?L:...) comută la potrivire în funcție de localitate, iar (?a:...) comută la potrivire numai ASCII (implicit).Această suprascriere este în vigoare numai pentru grupul îngust în linie, iar modul de potrivire inițial este restabilit în afara grupului.

    Noi în versiunea 3.6.

    Schimbat în versiunea 3.7: Literele 'a', 'L' și 'u' pot fi, de asemenea, utilizate într-un grup.

    (?P<name>...)

    Similar cu parantezele obișnuite, dar subșirul de caractere la care se potrivește grupul esteaccesibil prin intermediul numelui simbolic al grupului. Numele grupurilor trebuie să fie identificatoriPython valabili, iar fiecare nume de grup trebuie să fie definit o singură dată în cadrul unei expresii regulate. Un grup simbolic este, de asemenea, un grup numerotat, la fel ca și în cazul în care grupul nu a fost numit.

    Grupurile numite pot fi menționate în trei contexte. Dacă modelul este(?P<quote>).*?(?P=quote) (de ex. se potrivește cu un șir citat fie cu ghilimele simple, fie cu ghilimele duble):

    Contextul de referire la grupul „citat”

    Cum se poate face referire la acesta

    în același model însuși

      .

    • (?P=quote) (așa cum se arată)

    la prelucrarea obiectului de potrivire m

    • m.group('quote')

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

    într-un șir de caractere trecut la replierea lui re.sub()

    • \g<quote>

    • .

    • \g<1>

    (?P=name)

    O referință inversă la un grup numit; se potrivește cu orice text care a fost potrivit cu grupul anterior numit nume.

    (?#...)

    Un comentariu; conținutul parantezelor este pur și simplu ignorat.

    (?=...)

    Se potrivește dacă ... se potrivește cu următorul, dar nu consumă nimic din șir. Aceasta se numește o aserțiune de tip lookahead. De exemplu, Isaac (?=Asimov) se va potrivi cu 'Isaac ' numai dacă este urmat de 'Asimov'.

    (?!...)

    Se potrivește dacă ... nu se potrivește cu următorul. De exemplu, Isaac (?!Asimov) se va potrivi cu 'Isaac ' numai dacă nu este urmat de 'Asimov'.

    (?<=...)

    Se potrivește dacă poziția curentă în șir este precedată de o potrivire pentru ... care se termină la poziția curentă. Aceasta se numește „lookbehindassertion” pozitivă. (?<=abc)def va găsi o potrivire în 'abcdef', deoarece „lookbehind” va da înapoi cu 3 caractere și va verifica dacă modelul conținut se potrivește.Modelul conținut trebuie să se potrivească numai cu șiruri de o anumită lungime fixă, ceea ce înseamnă căabc sau a|b sunt permise, dar a* și a{3,4} nu sunt permise. Rețineți că șabloanele care încep cu afirmații pozitive de tip lookbehind nu se vor potrivi la începutul șirului căutat; cel mai probabil veți dori să utilizați funcțiasearch() mai degrabă decât funcția match():

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

    Acest exemplu caută un cuvânt care urmează după o cratimă:

    >>> m = re.search(r'(?<=-)\w+', 'spam-egg')>>> m.group(0)'egg'

    Schimbat în versiunea 3.5: S-a adăugat suport pentru referințe de grup de lungime fixă.

    (?<!...)

    Se potrivește dacă poziția curentă în șir nu este precedată de o potrivire pentru.... Aceasta se numește o afirmație negativă lookbehind. La fel ca în cazul afirmațiilor de tip lookbehind pozitiv, modelul conținut trebuie să se potrivească numai cu șiruri de o anumită lungime fixă. Modelele care încep cu aserțiuni negative de tip lookbehind pot să se potrivească la începutul șirului căutat.

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

    Încearcă să se potrivească cu yes-pattern dacă grupul cu id sau nume dat există, iar cu no-pattern dacă nu există. no-pattern este opțional și poate fi omis. De exemplu, (<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$) este un model slab de potrivire a e-mailurilor, care se va potrivi cu '<[email protected]>', precum și cu '[email protected]', dar nu cu '<[email protected]' și nici cu '[email protected]>'.

    Secvențele speciale constau din '\' și un caracter din lista de mai jos.Dacă caracterul obișnuit nu este o cifră ASCII sau o literă ASCII, atunci RE rezultat se va potrivi cu al doilea caracter. De exemplu, $ se potrivește cu caracterul '$'.

    \number

    Se potrivește cu conținutul grupului de același număr. Grupurile sunt numerotate începând de la 1. De exemplu, (.+) se potrivește cu 'the the' sau '55 55', dar nu și cu 'thethe' (a se observa spațiul de după grup). Această secvență specială poate fi utilizată numai pentru a se potrivi cu unul dintre primele 99 de grupuri. Dacă prima cifră a numărului este 0 sau dacă numărul are o lungime de 3 cifre octale, acesta nu va fi interpretat ca o potrivire de grup, ci ca un caracter cu valoarea octală a numărului. În interiorul'' unei clase de caractere, toate scăpările numerice sunt tratate ca și caractere.

    \A

    Se potrivește numai la începutul șirului.

    \b

    Se potrivește cu șirul gol, dar numai la începutul sau la sfârșitul unui cuvânt.Un cuvânt este definit ca o secvență de caractere de cuvânt. Rețineți că, din punct de vedere formal, \b este definit ca fiind limita dintre un caracter \w și un caracter \W (sau invers), sau între \w și începutul/ sfârșitul șirului.Aceasta înseamnă că r'\bfoo\b' se potrivește cu 'foo', 'foo.', '(foo)','bar foo baz', dar nu și cu 'foobar' sau 'foo3'.

    În mod implicit, caracterele alfanumerice Unicode sunt cele utilizate în modelele Unicode, dar acest lucru poate fi schimbat prin utilizarea indicatorului ASCII. Limitele cuvintelor sunt determinate de localitatea curentă în cazul în care se utilizează steagul LOCALE. în interiorul unui interval de caractere, \b reprezintă caracterul backspace, pentru compatibilitate cu literalele de șiruri de caractere din Python.

    \B

    Se potrivește cu șirul gol, dar numai atunci când acesta nu se află la începutul sau la sfârșitul unui cuvânt. Aceasta înseamnă că r'py\B' se potrivește cu 'python', 'py3','py2', dar nu cu 'py', 'py.' sau 'py!'.\B este exact opusul lui \b, astfel încât caracterele cuvintelor din modelele Unicode sunt caracterele alfanumerice Unicode sau liniuța de subliniere, deși acest lucru poate fi schimbat prin utilizarea indicatorului ASCII. Limitele cuvintelor sunt determinate de localitatea curentă în cazul în care se utilizează indicatorul LOCALE.

    \d Pentru modelele Unicode (str):

    Se potrivește cu orice cifră zecimală Unicode (adică orice caracter din categoria de caractere Unicode ). Aceasta include , dar și multe alte caractere numerice. Dacă se utilizează steagul ASCII, numai se potrivește.

    Pentru modele pe 8 biți (bytes):

    Se potrivește cu orice cifră zecimală; aceasta este echivalentă cu .

    \D

    Se potrivește cu orice caracter care nu este o cifră zecimală. Acesta este opusul lui \d. Dacă se utilizează indicatorul ASCII, acest lucru devine echivalentul lui .

    \s Pentru modele Unicode (str):

    Se potrivește cu caracterele de spații albe Unicode (care includ, dar și multe alte caractere, de exemplu spațiile de întrerupere impuse de regulile tipografice din multe limbi). Dacă se utilizează steagul ASCII, se potrivește numai.

    Pentru modelele pe 8 biți (bytes):

    Se potrivește cu caracterele considerate spații albe în setul de caractere ASCII; acest lucru este echivalent cu .

    \S

    Se potrivește cu orice caracter care nu este un caracter de spațiu alb. Acesta este opusul lui \s. Dacă se utilizează steagul ASCII, acest lucru devine echivalentul lui .

    \w Pentru modele Unicode (str):

    Se potrivește cu caracterele Unicode ale cuvintelor; aceasta include majoritatea caracterelor care pot face parte dintr-un cuvânt în orice limbă, precum și numerele și sublinierea. Dacă se utilizează steagul ASCII, se potrivește numai.

    Pentru modele pe 8 biți (bytes):

    Se potrivește cu caracterele considerate alfanumerice în setul de caractere ASCII; acest lucru este echivalent cu . În cazul în care se utilizează steagul LOCALE, se potrivește cu caracterele considerate alfanumerice în locale curentăși cu sublinierea.

    \W

    Se potrivește cu orice caracter care nu este un caracter de cuvânt. Acesta este opusul lui \w. Dacă se utilizează steagul ASCII, acesta devine echivalentul lui . Dacă se utilizează steagul LOCALE, se potrivește cu caracterele care nu sunt nici alfanumerice în localul curent și nici cu sublinierea.

    \Z

    Se potrivește numai la sfârșitul șirului.

    Majoritatea scăpărilor standard acceptate de literalele de șir de caractere Python sunt, de asemenea, acceptate de parserul de expresii regulate:

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

    (Rețineți că \b este utilizat pentru a reprezenta limitele cuvintelor și înseamnă „backspace „numai în interiorul claselor de caractere.)

    '\u', '\U' și '\N' secvențele de scăpare sunt recunoscute numai în Unicodepatterns. În modelele de octeți, acestea reprezintă erori. Evadările necunoscute ale literelor ASCII sunt rezervate pentru utilizare viitoare și sunt tratate ca erori.

    Evadările octale sunt incluse într-o formă limitată. Dacă prima cifră este un 0 sau dacă există trei cifre octale, se consideră că este vorba de o scăpare octală. În caz contrar, este o referință de grup. Ca și în cazul șirurilor de caractere, scăpările octale au întotdeauna o lungime de cel mult trei cifre.

    Schimbat în versiunea 3.3: Au fost adăugate secvențele de scăpare '\u' și '\U'.

    Schimbat în versiunea 3.6: Evadările necunoscute compuse din '\' și o literă ASCII sunt acum erori.

    Schimbat în versiunea 3.8: A fost adăugată secvența de evadare '\N{name}'. Ca și în literalele de șiruri de caractere,aceasta se extinde la caracterul Unicode numit (de exemplu, '\N{EM DASH}').

Lasă un răspuns

Adresa ta de email nu va fi publicată.