Krajta

Regulární výrazy pomocí Pythonu 3

Regulární výrazy pomocí Pythonu 3
Regulární výrazy jsou často považovány za skutečně nejasnou sérii hieroglyfů, které si člověk obvykle zkopíruje z internetu a vloží do svého kódu. Toto tajemné kouzlo pak ukazuje magické schopnosti hledání vzorů uvnitř řetězců textu a pokud se ho pěkně zeptáme, udělá nám dokonce laskavost nahradit daný vzor v řetězci něčím hezčím.

Například když píšete obslužné rutiny pro URL (a Bůh vám pomůže, pokud píšete úplně od začátku), často budete chtít zobrazit stejný výsledek bez ohledu na koncové '/' v URL. E.g https: // příklad.com / user / settings / a https: // příklad.com / user / settings by měly oba ukazovat na stejnou stránku i přes koncové '/'. 

Nelze však ignorovat všechna lomítka, například:

  1. Přední lomítko mezi „uživatelem“ a „nastavením“, e, „uživatelem / nastavením“.
  2. Také budete muset vzít v úvahu '//' na začátku vašeho FQDN následovaný 'https'.

Takže přijdete s pravidlem jako: „Ignorujte pouze lomítka následovaná prázdným místem.„A pokud chcete, můžete toto pravidlo zakódovat pomocí řady příkazů if-else. Ale to bude docela rychle těžkopádné. Můžete napsat funkci rčení cleanUrl (), která vám to může zapouzdřit. Ale vesmír na vás brzy začne házet více křivek. Brzy se ocitnete v psaní funkcí pro cleanHeaders (), processLog () atd. Nebo můžete použít regulární výraz, kdykoli je vyžadován jakýkoli druh porovnávání vzorů.

Standardní IO a soubory

Než se dostaneme do podrobností regulárních výrazů, stojí za zmínku model, který má většina systémů pro proudy textu. Zde je krátké (neúplné) shrnutí:

  1. Text se zpracovává jako (jeden) proud znaků.
  2. Tento stream může pocházet ze souboru textu Unicode nebo ASCII nebo ze standardního vstupu (klávesnice) nebo ze vzdáleného síťového připojení. Po zpracování, řekněme skriptem regulárního výrazu, výstup buď přejde do souboru nebo síťového proudu nebo na standardní výstup (např.g, konzole)
  3. Proud se skládá z jednoho nebo více řádků. Každý řádek má nulu nebo více znaků následovaných novým řádkem.

Kvůli zjednodušení chci, abyste si představili, že soubor se skládá z řádků končících znakem nového řádku. Tento soubor rozdělíme na jednotlivé řádky (nebo řetězce), z nichž každý končí buď novým řádkem, nebo normálním znakem (pro poslední řádek).

Regulární výrazy a řetězec

Regulární výraz nemá nic zvláštního se soubory. Představte si to jako černou skříňku, která může brát jako vstup libovolný řetězec libovolné (konečné) délky a jakmile dosáhne konce tohoto řetězce, může buď:

  1. Přijměte řetězec. Jinými slovy řetězec zápasy regulární výraz (regulární výraz).
  2. Odmítněte řetězec, tj.e, řetězec ne zápas regulární výraz (regulární výraz).

Navzdory své povaze black box-y přidám tomuto stroji několik dalších omezení. Regulární výraz přečte řetězec postupně, zleva doprava a čte najednou pouze jeden znak. Takže řetězec „LinuxHint“ s číst jako:

'L "i" n "u" x "H" i "n" t' [Zleva doprava]

Začněme jednoduše

Nejjednodušším typem regulárního výrazu by bylo hledat a porovnávat řetězec 'C'. Regulární výraz pro něj je jen „C“. Docela triviální. Způsob, jak to udělat v Pythonu, by vyžadoval, abyste nejprve importovali re modul pro regulární výrazy.

>>> import re

Potom použijeme funkci re.Vyhledávání(vzor, ​​řetězec) kde vzor je náš regulární výraz a tětiva ve vstupním řetězci, ve kterém hledáme vzor.

>>> znovu.hledat („C“, „Tato věta obsahuje záměrné písmeno C“)

Funkce převezme vzor 'C', vyhledá jej ve vstupním řetězci a vytiskne umístění (span) kde se nachází uvedený vzor. Tato část řetězce, tento podřetězec odpovídá našemu regulárnímu výrazu. Pokud by nebyla nalezena žádná taková shoda, výstup by byl Žádný objekt.

Podobně můžete vzor „regulárního výrazu“ vyhledat následovně:

>>> znovu.vyhledávání („regulární výraz“, „Pro vyhledávání vzorů můžeme použít regulární výrazy.”)

re.hledat (), znovu.match () a znovu.fullmatch ()

Tři užitečné funkce modulu re zahrnují:

1.  re.Vyhledávání(vzor, ​​řetězec)

Tím se vrátí zpět podřetězec, který odpovídá vzoru, jak jsme viděli výše. Pokud není nalezena žádná shoda, pak Žádný je vrácen. Pokud více podřetězců odpovídá danému vzoru, je nahlášen pouze první výskyt.

2.  re.zápas(vzor, ​​řetězec)

Tato funkce se pokusí porovnat dodaný vzor od začátku řetězce. Pokud někde uprostřed cesty narazí na přestávku, vrátí se Žádný.

Například,

>>> znovu.shoda („Joh“, „John Doe“)

Kde jako řetězec „Jmenuji se John Doe“ není shoda, a tedy Žádný je vrácen.

>>> tisk (re.shoda („Joh“, „Jmenuji se John Doe“))
Žádný

3.  re.fullmatch (vzor, ​​řetězec)

To je přísnější než výše uvedené a pokusí se najít přesnou shodu vzoru v řetězci, jinak je výchozí Žádný.

>>> tisk (re.fullmatch ("Joh", "Joh"))

# Cokoliv jiného nebude odpovídat

Budu používat jen re.Vyhledávání() funkce ve zbytku tohoto článku. Kdykoli řeknu, že regulární výraz přijme tento řetězec, znamená to, že re.Vyhledávání() funkce našla ve vstupním řetězci odpovídající podřetězec a místo toho jej vrátila Žádnýobjekt.

Speciální znaky

Regulární výrazy jako „John“ a „C“ nejsou příliš užitečné. Potřebujeme speciální znaky, které konkrétní znamená v kontextu regulárních výrazů. Zde je několik příkladů:

    1. ^ - To odpovídá začátku řetězce. Například '^ C' bude odpovídat všem řetězcům, které začínají písmenem C.
    2. $ - To odpovídá konci řádku.
    3. . - Tečka označuje jeden nebo více znaků, kromě nového řádku.
    4. * - Toto je nula nebo více znaků toho, co tomu předcházelo. Takže b * odpovídá 0 nebo více výskytům b. ab * odpovídá pouze a, ab a a
    5. + - Jedná se o jeden nebo více znaků toho, co tomu předcházelo. Takže b + odpovídá 1 nebo více výskytům b. ab * odpovídá pouze a, ab a a
    6. \ - Zpětné lomítko se používá jako úniková sekvence v regulárních výrazech. Takže chcete regulární výraz, který bude místo konce řádku hledat doslovnou přítomnost symbolu dolaru „$“. Můžete psát \ $ v regulárním výrazu.
    7. Kudrnaté závorky lze použít k určení počtu opakování, které chcete vidět. Například vzor jako ab 10 znamená řetězec a za ním 10 b bude odpovídat tomuto vzoru. Můžete také určit rozsah čísel, například b 4,6 odpovídá řetězcům obsahujícím b opakované 4 až 6krát za sebou. Vzor pro 4 nebo více opakování by vyžadoval pouze koncovou čárku, například b 4,
    8. Hranaté závorky a rozsah znaků. RE like [0-9] může fungovat jako zástupný symbol pro jakoukoli číslici mezi 0 a 9. Podobně můžete mít číslice mezi jednou a pěti [1-5] nebo pro shodu jakéhokoli velkého písmene použijte [A-Z] nebo jakéhokoli písmene abecedy bez ohledu na to, zda jde o velká nebo malá písmena [A-z].
      Například libovolný řetězec, který má přesně deset číslic, odpovídá regulárnímu výrazu [0-9] 10, což je docela užitečné, pokud hledáte telefonní čísla v daném řetězci.
    9. Pomocí příkazu | můžete vytvořit příkaz typu NEBO znak, kde je regulární výraz tvořen dvěma nebo více regulárními výrazy, řekněme A a B. Regulární výraz A | B je shoda, pokud je vstupní řetězec shodou pro regulární výraz A nebo B.
    10. Můžete seskupit různé regulární výrazy dohromady. Například regex (A | B) C bude odpovídat regexům pro AC a

Je toho ještě mnohem víc, ale doporučil bych se učit za pochodu místo toho, abyste přetěžovali mozek spoustou temných symbolů a hranových případů. V případě pochybností jsou dokumenty Pythonu skvělou pomocí a nyní toho víte dost na to, abyste tyto dokumenty mohli snadno sledovat.

Ruce na zkušenosti a reference

Pokud chcete vidět vizuální interpretaci svého regulárního výrazu, můžete navštívit Debuggex. Tento web generuje pohled na váš regulární výraz v reálném čase a umožňuje vám jej otestovat na různých vstupních řetězcích.

Chcete-li se dozvědět více o teoretických aspektech regulárních výrazů, můžete se podívat na prvních pár kapitol Úvod do teorie výpočtu od Michaela Sipsera. Je velmi snadné jej sledovat a ukazuje důležitost regulárních výrazů jako základního konceptu samotného výpočtu!

Kurzor při psaní v systému Windows 10 skáče nebo se pohybuje náhodně
Pokud zjistíte, že kurzor myši skáče nebo se pohybuje sám, automaticky, náhodně při psaní v notebooku nebo počítači se systémem Windows, pak vám někte...
Jak obrátit směr posouvání myši a touchpadu ve Windows 10
Myš a Touchpadnejenže usnadňují výpočet, ale jsou efektivnější a méně časově náročné. Nemůžeme si představit život bez těchto zařízení, ale přesto je ...
Jak změnit velikost, barvu a schéma kurzoru myši a kurzoru v systému Windows 10
Ukazatel myši a kurzor ve Windows 10 jsou velmi důležité aspekty operačního systému. To lze říci i pro jiné operační systémy, takže ve skutečnosti nej...