Základy vyhledávání prostřednictvím regulárních výrazů¶
Tento kontrolní seznam shrnuje nejčastěji používané nebo těžko zapamatovatelné části modulu regulárních výrazů, které jsou k dostupné ve většině součástí Calibre.
Třídy znaků¶
Stručně řečeno jsou třídy znaků užitečné pro zastupování různých skupin znaků.
Příklady:
Zastoupení |
Třída |
|
Malá písmena. Nezahrnuje znaky s diakritikou a ligatury |
|
Malá písmena od a do z nebo čísla od 0 do 9 |
|
Velká nebo malá písmena nebo pomlčka. Pro zahrnutí pomlčky do třídy ji musíte umístit na začátek nebo na konec, aby se nepletla se spojovníkem, který určuje rozsah znaků. |
|
Libovolný znak kromě číslice. Stříška (^) umístěná na začátku třídy vylučuje znaky ze třídy (doplňková třída) |
|
Malá písmena souhlásek. Třída může být zahrnuta do třídy. Znaky |
|
Všechna písmena (včetně cizích znaků s diakritikou). Uvnitř třídy lze použít zkrácené třídy |
Příklad:
<[^<>]+> to select an HTML tag
Zjednodušené třídy znaků¶
Zastoupení |
Třída |
|
Číslo (stejné jako |
|
Libovolný nečíselný znak (stejné jako |
|
Alfanumerický znak ( |
|
Libovolný znak, který není „slovo“ |
|
Mezera, pevná mezera, tabulátor, enter. |
|
Libovolný znak, který není „prázdný znak“ |
|
Jakýkoliv znak kromě nového řádku. Použijte zaškrtávací políčko „vytečkovat vše“ nebo modifikátor regulárních výrazů |
Kvantifikátory¶
Kvantifikátor |
Počet výskytů výrazů předcházejících kvantifikátor |
|
0 nebo 1 výskytů výrazu. Stejné jako |
|
1 nebo více výskytů výrazu. Stejné jako |
|
0, 1 nebo více výskytů výrazu. Stejné jako |
|
Přesně n výskytů výrazu |
|
Počet výskytů mezi minimální a maximální hodnotou včetně |
|
Počet výskytů mezi minimální hodnotou včetně a nekonečnem |
|
Počet výskytů mezi 0 a maximální hodnotou včetně |
Nenasytnost¶
Ve výchozím nastavení je modul regulárního výrazu s kvantifikátory nenasytný: rozšiřuje výběr co nejvíce. To zpočátku často způsobuje překvapení. ?
následovaný kvantifikátorem je lenost. Vyhněte se dávání dvou do stejného výrazu, výsledek může být nepředvídatelný.
Dejte si pozor na vnořené kvantifikátory, například vzor (a*)*
, protože exponenciálně zvyšuje dobu zpracování.
Alternace¶
Znak |
v regulárním výrazu je logické OR
. To znamená, že se může shodovat buď předcházející nebo následující výraz.
Vyloučení¶
Metoda 1
vzor_k_vyloučení(*SKIP)(*FAIL)|vzor_k_vybrání
Příklad:
"Blabla"(*SKIP)(*FAIL)|Blabla
vybere Blabla v řetězcích Blabla nebo „Blabla nebo Blabla“, ale ne v „Blabla“.
Metoda 2
vzor_k_vyloučení\K|(vzor_k_vybrání)
"Blabla"\K|(Blabla)
vybere Blabla v řetězcích Blabla nebo „Blabla nebo Blabla“, ale ne v „Blabla“.
Kotvy¶
Kotva je způsob, jak porovnat logické umístění v řetězci, spíše než znaku. Nejužitečnější kotvy pro zpracování textu jsou:
\b
Určuje hranici slova, tj. přechod z mezery na nemezerový znak. Například můžete použít
\bdar
, aby odpovídalmám dar
, ale nenezdar
.^
Odpovídá začátku řádku (v režimu více řádků, což je výchozí nastavení)
$
Odpovídá konci řádku (v režimu více řádků, což je výchozí nastavení)
\K
Obnovuje výchozí pozici výběru na pozici ve vzoru. Některé moduly regulárních výrazů (ale ne Calibre) nedovolí hledat vpřed v proměnlivé délce, obzvláště s kvantifikátory. Když můžete s těmito moduly použít
\K
, také vám to umožní zbavit se tohoto limitu napsáním ekvivalentu pozitivního hledání vpřed v proměnlivé délce.
Skupiny¶
(výraz)
Zachytávací skupina: Uloží výběr a může být později vyvolána ve vzorech search nebo replace pomocí
\n
, kden
je pořadové číslo zachytávací skupiny (počínaje od 1 v pořadí čtení)(?:výraz)
Skupina, která nezachytí výběr
(?>výraz)
Atomická skupina: Jakmile je výraz splněn, modul regulárních výrazů ji předá. A pokud zbytek vzoru selže, nebude se snažit vyzkoušet jiné kombinace s výrazem. Atomické skupiny nezachycují.
(?|výraz)
Skupina obnovení větve: Větve alternativ zahrnutých ve výrazu sdílejí stejná čísla skupin
(?<name>výraz)
Skupina s názvem „name“: Výběr lze později vyvolat ve vzorci search pomocí výrazu
(?P=name)
a ve vzorci replace výrazem\g
. Dvě různé skupiny mohou používat stejný název.
Prohledávání¶
Prohledávání |
Význam |
|
Pozitivní hledání vpřed (bude umístěno za výběr) |
|
Negativní hledání vpřed (bude umístěno za výběr) |
|
Pozitivní hledání zpět (bude umístěno před výběr) |
|
Negativní hledání zpět (bude umístěno před výběr) |
Hledání vpřed a zpět nespotřebovávají znaky, jsou nulové délky a nezachycují. Jsou to atomické skupiny: jakmile je tvrzení splněno, modul regulárních výrazů ho předá, a pokud zbytek vzoru selže, nebude se vracet zpět do prohledávání, aby vyzkoušel jiné kombinace.
Při hledání více shod v řetězci, v počáteční pozici každého pokusu o shodu, může hledání zpět zkontrolovat znaky před aktuální pozicí. Proto v řetězci 123 by měl vzor (?<=\d)\d
(číslice předcházející číslici) teoreticky vybrat 2 a 3. Na druhou stranu \d\K\d
může vybrat pouze 2, protože počáteční pozice po prvním výběru je bezprostředně před 3 a pro druhou shodu zde není dostatek číslic. Podobně \d(\d)
zachytí pouze 2. V modulu regulárních výrazů Calibre se pozitivní hledání zpět chová stejně a vybere pouze 2, na rozdíl od teorie.
Skupiny mohou být umístěny uvnitř prohledávání, ale zachytávání je zřídka užitečné. Pokud je to přesto užitečné, bude muset být při používání kvantifikátoru v hledání zpět velmi opatrní: chamtivost spojená s absencí zpětného dozoru může poskytovat překvapující zachytávání. Z tohoto důvodu použijte spíše \K
než pozitivní hledání zpět, když máte v zachytávací skupině pozitivního hledání zpět kvantifikátor (nebo ještě hůře několik).
Příklad negativního hledání vpřed:
(?![^<>{}]*[>}])
Umístění na konci vzoru zabraňuje výběru uvnitř značky nebo stylu vloženého do souboru.
Kdykoliv je to možné, je vždy lepší vyhledávání „ukotvit“, aby se snížil počet kroků nezbytných k dosažení výsledku.
Rekurze¶
Zastoupení |
Význam |
|
Rekurze celého vzoru |
|
Rekurze jediného vzoru číslované zachytávací skupiny, zde skupina 1 |
Rekurze je vyvolání sebe sama. To je užitečné pro vyvážené dotazy, jako jsou řetězce v uvozovkách, které mohou obsahovat vložené řetězce v uvozovkách. Pokud tedy během zpracování řetězce mezi uvozovkami narazíme na začátek nového řetězce mezi uvozovkami, dobře víme, jak to udělat, a vyvoláme sebe sama. Pak máme podobný vzor:
start-pattern(?>atomic sub-pattern|(?R))*end-pattern
Pro výběr řetězce mezi uvozovkami bez zastavení na vloženém řetězci:
“((?>[^“”]+|(?R))*[^“”]+)”
Tuto šablonu lze také použít ke změně párů značek, které mohou být vloženy, například značek <div>
.
Speciální znaky¶
Zastoupení |
Znak |
|
tabulátor |
|
konec řádku |
|
(měkká) mezera |
|
tvrdá mezera |
Metaznaky¶
Metaznaky jsou ty, které mají zvláštní význam pro modul regulárních výrazů. Dvanáct z nich musí předcházet řídící znak, zpětné lomítko (\
), aby ztratily svůj zvláštní význam a stal se z nich opět normální znak:
^ . [ ] $ ( ) * + ? | \
Sedm dalších metaznaků nemusí předcházet zpětné lomítko (ale může bez jakýchkoliv dalších důsledků):
{ } ! < > = :
Speciální znaky ztratí svůj status, pokud jsou použity ve třídě (mezi lomenými závorkami []
). Uzavírací lomená závorka a pomlčka mají ve třídě zvláštní status. Mimo třídu je pomlčka jednoduchým literálem, uzavírací lomená závorka zůstává metaznakem.
Lomítko (/) a křížek (nebo znak hash) (#) nejsou metaznaky, nemusejí mít řídící znak.
V některých nástrojích, jako je například regex101.com s modulem Python, mají dvojité uvozovky zvláštní status oddělovače a musí mít řídící znak, nebo se možnosti změní. Toto není případ editoru Calibre.
Režimy¶
(?s)
Způsobí, že tečka (
.
) bude odpovídat také znakům nového řádku(?m)
Učiní, že kotvy
^
a$
budou odpovídat začátku a konci řádků namísto začátku a konce celého řetězce.