re – Operace s regulárními výrazy¶

Syntaxe regulárních výrazů¶

Regulární výraz (neboli RE) určuje množinu řetězců, které mu odpovídají; funkce v tomto modulu umožňují ověřit, zda určitý řetězec odpovídá danémuregulárnímu výrazu (nebo zda daný regulární výraz odpovídá určitémuřetězci, což je totéž).

Regulární výrazy lze spojovat a vytvářet tak nové regulární výrazy; pokud Aa B jsou oba regulární výrazy, pak AB je také regulární výraz. obecně platí, že pokud řetězec p odpovídá A a jiný řetězec q odpovídá B, bude řetězec pq odpovídat AB. To platí, pokud A nebo B neobsahují operace s nízkou precedencí, okrajové podmínky mezi A a B nebo číslované skupinové odkazy. Složité výrazy lze tedy snadno sestavit z jednoduššíchprimitivních výrazů, jako jsou zde popsané výrazy. Podrobnosti o teoriia implementaci regulárních výrazů najdete ve Friedlově knize ,nebo téměř v jakékoli učebnici o konstrukci překladačů.

Následuje stručné vysvětlení formátu regulárních výrazů. Dalšíinformace a jemnější prezentaci najdete v příručce Regular Expression HOWTO.

Regulární výrazy mohou obsahovat speciální i běžné znaky. Nejobyčejnější znaky, jako 'A', 'a' nebo '0', jsou nejjednoduššími regulárními výrazy; jednoduše se shodují. Běžné znaky můžete spojovat, takže last odpovídá řetězci 'last'. (Ve zbytku tohoto oddílu budeme zapisovat RE v this special style, obvykle bez uvozovek, a řetězce, které mají být porovnány 'in single quotes')

Některé znaky, jako '|' nebo '(', jsou speciální. Speciální znaky buď označují třídy běžných znaků, nebo ovlivňují způsob interpretace regulárních výrazů v jejich okolí.

Kvalifikátory opakování (*, +, ?, {m,n} atd.) nelze nepřímo vnořovat. Tím se zamezí nejednoznačnosti s nespravedlivou modifikátorovou koncovkou ? a s jinými modifikátory v jiných implementacích. Pro použití druhého opakování na vnitřní opakování lze použít závorky. Například výraz (?:a{6})* odpovídá libovolnému násobku šesti znaků 'a'.

Speciální znaky jsou:

.

(tečka.) Ve výchozím režimu odpovídá libovolnému znaku kromě nového řádku. Pokud byl zadán příznak DOTALL, odpovídá jakémukoli znakuvčetně nového řádku.

^

(Caret.) Odpovídá začátku řetězce a v režimu MULTILINE odpovídá také bezprostředně za každým novým řádkem.

$

Odpovídá konci řetězce nebo těsně před novým řádkem na konci řetězce a v režimu MULTILINE odpovídá také před novým řádkem. fooShoduje se jak s ‚foo‘, tak s ‚foobar‘, zatímco regulární výraz foo$ se shoduje pouze s ‚foo‘. Ještě zajímavější je, že hledání foo.$ v 'foo1\nfoo2\n' odpovídá ‚foo2‘ normálně, ale ‚foo1‘ v režimu MULTILINE; hledáníjediného $ v 'foo\n' najde dvě (prázdné) shody: jednu těsně před novým řádkem a jednu na konci řetězce.

*

Způsobí, že výsledný RE odpovídá 0 nebo více opakováním předchozího RE, tolika opakováním, kolik je možné. ab* Bude odpovídat ‚a‘, ‚ab‘ nebo ‚a‘ následované libovolným počtem ‚b‘.

+

Způsobí, že výsledný RE bude odpovídat 1 nebo více opakováním předchozího RE.ab+ Bude odpovídat ‚a‘ následované libovolným nenulovým počtem ‚b‘; nebude odpovídat pouze ‚a‘.

?

Způsobí, že výsledný RE bude odpovídat 0 nebo 1 opakování předchozího RE. ab? bude odpovídat buď ‚a‘, nebo ‚ab‘.

*?,+?,??

Kvalifikátory '*', '+' a '?' jsou všechny chamtivé; odpovídají co největšímu množství textu. Někdy toto chování není žádoucí; pokud je RE<.*> porovnáván s '<a> b <c>', bude porovnáván celý řetězec, a ne jen '<a>'. Přidáním ? za kvalifikátor se provede shoda nešetrným nebo minimálním způsobem; bude porovnáno co nejméně znaků. Při použití RE <.*?> bude odpovídat pouze '<a>'.

{m}

Určuje, že má být porovnáno přesně m kopií předchozího RE; menší počet znaků způsobí, že nebude porovnán celý RE. Například a{6} bude odpovídat přesně šesti znakům 'a', ale ne pěti.

{m,n}

Způsobí, že výsledný RE bude odpovídat m až n opakováním předchozíhoRE, přičemž se pokusí odpovídat co nejvíce opakováním. Například a{3,5} bude odpovídat 3 až 5 znakům 'a'. Vynechání m určuje spodní hranici nula a vynechání n určuje nekonečnou horní hranici. Jako příklad lze uvést, že a{4,}b bude odpovídat 'aaaab' nebo tisíci znaků 'a' následovaných znakem 'b', ale ne 'aaab'. Čárka se nesmí vynechat, jinak by byl modifikátor zaměněn s dříve popsaným tvarem.

{m,n}?

Způsobí, že výsledný RE bude odpovídat m až n opakováním předchozíhoRE, přičemž se bude snažit odpovídat co nejmenšímu počtu opakování. Jedná se tedy o nešetrnou verzi předchozího kvalifikátoru. Například u šestiznakového řetězce 'aaaaaa' bude a{3,5} odpovídat 5 znakům 'a', zatímco a{3,5}? bude odpovídat pouze 3 znakům.

\

Buď escapuje speciální znaky (což umožňuje odpovídat znakům jako'*', '?' a podobně), nebo signalizuje speciální sekvenci; speciální sekvence jsou popsány níže.

Pokud k vyjádření vzoru nepoužíváte surový řetězec, nezapomeňte, že Pythonal používá jako escape sekvenci v řetězcových literálech také zpětné lomítko; pokud parser Pythonu tuto escape sekvenci nerozpozná, zpětné lomítko a následný znak se zahrnou do výsledného řetězce. Pokud by však Python výslednou sekvenci rozpoznal, mělo by se zpětné lomítko opakovat dvakrát. To je složité a těžko pochopitelné, takže se důrazně doporučuje, abyste pro všechny výrazy kromě těch nejjednodušších používali řetězce.

Používá se k označení sady znaků. V sadě:

  • Znaky mohou být uvedeny jednotlivě, např. bude odpovídat 'a','m' nebo 'k'.

  • Rozsahy znaků lze uvést uvedením dvou znaků a jejich oddělením '-', například bude odpovídat jakémukoli malému písmenu ASCII, bude odpovídat všem dvoumístným číslům od 00 do 59 a bude odpovídat jakékoli šestnáctkové číslici. Pokud je - escapován (např. ) nebo pokud je umístěn jako první nebo poslední znak(např. nebo ), bude odpovídat doslovnému '-'.

  • Speciální znaky uvnitř sad ztrácejí svůj speciální význam. Například bude odpovídat kterémukoli z literálních znaků '(', '+','*' nebo ')'.

  • Třídy znaků, jako jsou \w nebo \S (definované níže), jsou uvnitř sady také akceptovány, ačkoli znaky, kterým odpovídají, závisí na tom, zda je v platnosti režimASCII nebo LOCALE.

  • Znaky, které nejsou v rozsahu, lze porovnat doplněním sady. Pokud je prvním znakem množiny '^', budou porovnány všechny znaky, které nejsou v množině. Například bude odpovídat každému znaku kromě '5' a bude odpovídat každému znaku kromě'^'. ^ nemá žádný zvláštní význam, pokud není prvním znakem v sadě.

  • Chcete-li uvnitř sady porovnat doslovný znak ']', předepište jej zpětným lomítkem nebo jej umístěte na začátek sady. Například {}] i() se budou shodovat se závorkou.

  • Podpora vnořených množin a operací s množinami jako v technické normě Unicode TechnicalStandard #18 může být přidána v budoucnu. To by změnilo syntaxi, takže pro usnadnění této změny bude v nejednoznačných případech zatím vznášeno FutureWarning, což zahrnuje množiny začínající literálem '.

    (...)

    Zachycuje jakýkoli regulární výraz uvnitř závorek a označuje začátek a konec skupiny; obsah skupiny lze získat po provedené shodě a lze jej porovnat později v řetězci pomocí speciální sekvence \number, popsané níže. Chcete-li porovnat literály '(' nebo ')',použijte \( nebo \) nebo je uzavřete uvnitř třídy znaků: , .

    (?...)

    Jedná se o rozšiřující zápis ('?' následující za '(' jinak nemá smysl). První znak za '?' určuje, jaký je význama další syntaxe konstrukce. Rozšíření obvykle nevytvářejí novou skupinu; (?P<name>...) je jedinou výjimkou z tohoto pravidla. Následujísoučasně podporovaná rozšíření:

    (?aiLmsux)

    (Jedno nebo více písmen z množiny 'a', 'i', 'L', 'm','s', 'u', 'x'). Skupina odpovídá prázdnému řetězci; písmena nastavují příslušné příznaky: re.A (shoda pouze ASCII),re.I (ignorování velkých a malých písmen), re.L (závislé na lokalizaci),re.M (víceřádkové), re.S (tečka odpovídá všem),re.U (shoda s Unicode) a re.X (slovní),pro celý regulární výraz (příznaky jsou popsány v části Obsah modulu.)To je užitečné, pokud chcete příznaky zahrnout jako součást regulárního výrazu, místo abyste funkcire.compile() předávali argument příznaku. Příznaky by měly být použity jako první vřetězci regulárního výrazu.

    (?:...)

    Nepříznaková verze regulárních závorek. Odpovídá jakémukoli regulárnímuvýrazu, který je uvnitř závorek, ale podřetězec, kterému skupina odpovídá, nelze po provedení shody načíst nebo se na něj později ve vzoru odkázat.

    (?aiLmsux-imsx:...)

    (Nula nebo více písmen z množiny 'a', 'i', 'L', 'm','s', 'u', 'x', volitelně následovaných '-' následovaným jedním nebo více písmeny z množiny 'i', 'm', 's', 'x'.)Písmena nastavují nebo odebírají odpovídající příznaky:re.A (přiřazování pouze ASCII), re.I (ignorování velkých a malých písmen),re.L (závislé na lokalizaci), re.M (víceřádkové),re.S (tečka odpovídá všem), re.U (přiřazování Unicode) a re.X (slovní), pro danou část výrazu.(Příznaky jsou popsány v části Obsah modulu.)

    Písmena 'a', 'L' a 'u' se při použitíjako řádkové příznaky vzájemně vylučují, takže je nelze kombinovat ani následovat za '-'. Místo toho, když se některý z nich objeví ve skupině inline, přepíše režim shody v uzavírající skupině. Ve vzorech Unicode (?a:...) přepíná na přiřazování pouzeASCII a (?u:...) přepíná na přiřazování Unicode(výchozí). V bajtovém vzoru (?L:...) přepne na porovnávání v závislosti na locale a (?a:...) přepne na porovnávání pouze ASCII (výchozí). toto přepsání platí pouze pro úzkou inline skupinu a mimo skupinu se obnoví původní režim porovnávání.

    Novinka ve verzi 3.6.

    Změněno ve verzi 3.7: Ve skupině lze použít také písmena 'a', 'L' a 'u'.

    (?P<name>...)

    Podobně jako běžné závorky, ale podřetězec odpovídající skupině jepřístupný přes symbolický název skupiny. Názvy skupin musí být platnými identifikátoryPythonu a každý název skupiny musí být definován pouze jednou v rámci pravidelného výrazu. Symbolická skupina je také číslovaná skupina, stejně jako kdyby skupina nebyla pojmenovaná.

    Nejmenované skupiny lze odkazovat ve třech kontextech. Pokud je vzor(?P<quote>).*?(?P=quote) (tj. odpovídá řetězci uvozenému buď jednoduchými, nebo dvojitými uvozovkami):

    Kontext odkazu na skupinu „uvozovky“

    Způsoby odkazu

    v samotném vzoru

      .

    • (?P=quote) (podle obrázku)

    při zpracování shodného objektu m

    • m.group('quote')

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

    v řetězci předávaném do replargumentu re.sub()

    • \g<quote>

    • .

    • \g<1>

    (?P=name)

    Zpětný odkaz na pojmenovanou skupinu; odpovídá jakémukoli textu, který odpovídal dřívějšímu pojmenovanému názvu skupiny.

    (?#...)

    Komentář; obsah závorek je jednoduše ignorován.

    (?=...)

    Shoduje se, pokud se ... shoduje s dalším, ale nespotřebovává žádnou část řetězce. Tomu se říká lookahead assertion. Například Isaac (?=Asimov) bude odpovídat'Isaac ' pouze tehdy, pokud za ním bude následovat 'Asimov'.

    (?!...)

    Odpovídá, pokud ... neodpovídá dalšímu. Jedná se o záporné tvrzení lookahead, například Isaac (?!Asimov) bude odpovídat 'Isaac ' pouze tehdy, pokud za ním nenásleduje 'Asimov'.

    (?<=...)

    Odpovídá, pokud aktuální pozici v řetězci předchází shoda pro ..., která končí na aktuální pozici. Tomu se říká pozitivní lookbehindassertion. (?<=abc)def najde shodu v 'abcdef', protože lookbehind se vrátí o 3 znaky zpět a zkontroluje, zda obsažený vzor odpovídá. obsažený vzor musí odpovídat pouze řetězcům určité pevné délky, což znamená, že abc nebo a|b jsou povoleny, ale a* a a{3,4} ne. Všimněte si, že vzory, které začínají kladným tvrzením lookbehind, nebudou odpovídat nazačátku hledaného řetězce; pravděpodobně budete chtít použít funkcisearch() spíše než funkci match():

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

    Tento příklad hledá slovo následující za pomlčkou:

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

    Změněno ve verzi 3.5: Přidána podpora pro skupinové odkazy pevné délky.

    (?<!...)

    Vyhledá, pokud aktuální pozici v řetězci nepředchází shoda pro.... Tomu se říká negativní lookbehind tvrzení. Podobně jako pozitivní lookbehind tvrzení musí obsažený vzor odpovídat pouze řetězcům určité pevné délky. Vzory, které začínají negativním lookbehind tvrzením, mohouodpovídat na začátku hledaného řetězce.

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

    Pokusí se o shodu s yes-pattern, pokud skupina s daným id nebo názvem existuje, a s no-pattern, pokud neexistuje. no-pattern je nepovinný a lze jej vynechat. Například (<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$) je špatný vzor pro párování e-mailů, který se bude shodovat s '<[email protected]>' i '[email protected]', ale ne s '<[email protected]' ani '[email protected]>'.

    Speciální sekvence se skládá z '\' a znaku z níže uvedeného seznamu. pokud běžný znak není číslice ASCII nebo písmeno ASCII, pak se výsledný RE bude shodovat s druhým znakem. Například $ odpovídá znaku '$'.

    \number

    Odpovídá obsahu skupiny stejného čísla. Skupiny jsou číslovány od 1. Například (.+) odpovídá 'the the' nebo '55 55',ale ne 'thethe' (všimněte si mezery za skupinou). Tuto speciální sekvenci lze použít pouze k přiřazení jedné z prvních 99 skupin. Pokud je první číslice čísla 0 nebo je číslo dlouhé 3 osmičkové číslice, nebude interpretováno jako shoda skupiny, ale jako znak s osmičkovou hodnotou čísla. Uvnitř'' třídy znaků jsou všechny číselné escapes považovány za znaky.

    \A

    Shoduje se pouze na začátku řetězce.

    \b

    Shoduje se s prázdným řetězcem, ale pouze na začátku nebo na konci slova. slovo je definováno jako posloupnost znaků slova. Všimněte si, že formálně je \b definován jako hranice mezi znakem \w a \W(nebo naopak) nebo mezi \w a začátkem/koncem řetězce.To znamená, že r'\bfoo\b' odpovídá 'foo', 'foo.', '(foo)','bar foo baz', ale ne 'foobar' nebo 'foo3'.

    Ve výchozím nastavení se ve vzorech Unicode používají alfanumerické znaky Unicode, ale to lze změnit pomocí příznaku ASCII. Hranice slov se určují podle aktuálního locale, pokud je použit příznak LOCALE.Uvnitř rozsahu znaků představuje \b znak backspace pro kompatibilitu s řetězcovými literály jazyka Python.

    \B

    Podporuje prázdný řetězec, ale pouze pokud není na začátku nebo na konci slova. To znamená, že r'py\B' odpovídá 'python', 'py3','py2', ale ne 'py', 'py.' nebo 'py!'.\B je pravým opakem \b, takže znaky slova v Unicodepatternu jsou alfanumerické znaky Unicode nebo podtržítko, i když to lze změnit použitím příznaku ASCII. Hranice slov se určují podle aktuálního locale, pokud je použit příznak LOCALE.

    \d Pro vzory Unicode (str):

    Překrývá libovolnou desetinnou číslici Unicode (tj. libovolný znak kategorie znakůUnicode ). Patří sem a také mnoho dalších znaků číslic. Pokud je použit příznak ASCII, porovnává se pouze .

    Pro 8bitové (bajtové) vzory:

    Překrývá jakoukoli desetinnou číslici; to je ekvivalentní .

    \D

    Překrývá jakýkoli znak, který není desetinnou číslicí. To je opak \d. Pokud je použit příznak ASCII, stává se to ekvivalentem .

    \s Pro vzory Unicode (str):

    Překonává bílé znaky Unicode (což zahrnuje a také mnoho dalších znaků, například mezery předepsané typografickými pravidly v mnoha jazycích). Pokud je použit příznak ASCII, je porovnáván pouze znak.

    Pro 8bitové (bajtové) vzory:

    Překrývá znaky, které jsou v sadě znaků ASCII považovány za bílé znaky; to odpovídá .

    \S

    Překrývá jakýkoli znak, který není bílým znakem. Toto je opak znaku \s. Pokud je použit příznak ASCII, stává se to ekvivalentem .

    \w Pro vzory Unicode (str): ASCII, je porovnáván pouze znak. Pro 8bitové (bajtové) vzory:

    Překrývá znaky, které jsou v sadě znaků ASCII považovány za alfanumerické; to odpovídá . Pokud je použit příznak LOCALE, odpovídá znakům považovaným za alfanumerické v aktuálním localea podtržítku.

    \W

    Podporuje jakýkoli znak, který není slovním znakem. Jedná se o opak \w. Pokud je použit příznak ASCII, stává se ekvivalentem . Pokud je použit příznak LOCALE, odpovídá znakům, které nejsou ani alfanumerické v aktuálním lokálu, ani podtržítko.

    \Z

    Odpovídá pouze na konci řetězce.

    Většinu standardních escapes podporovaných řetězcovými literály Pythonu akceptuje také parser regulárních výrazů:

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

    (Všimněte si, že \b se používá k reprezentaci hranic slov a znamená „backspace „pouze uvnitř tříd znaků.)

    '\u', '\U' a '\N' escape sekvence jsou rozpoznávány pouze v Unicodepatterns. V bajtových vzorech jsou chybami. Neznámé escap sekvence ASCIIpísmen jsou rezervovány pro budoucí použití a jsou považovány za chyby.

    Okrajové escap sekvence jsou zahrnuty v omezené podobě. Pokud je první číslicí 0 nebo pokud existují tři osmičkové číslice, je to považováno za osmičkový escape. V opačném případě se jedná o skupinový odkaz. Stejně jako u řetězcových literálů jsou osmičkové escapes vždy maximálně třímístné.

    Změněno ve verzi 3.3: Byly přidány escapovací sekvence '\u' a '\U'.

    Změněno ve verzi 3.6: Byly přidány escapovací sekvence '\u' a '\U':

    Změněno ve verzi 3.8: Neznámé escapovací sekvence složené z '\' a písmene ASCII jsou nyní chybami: Byla přidána escape sekvence '\N{name}'. Stejně jako v řetězcových literálech expanduje na pojmenovaný znak Unicode (např. '\N{EM DASH}').

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.