Python

Regulárne výrazy pomocou Pythonu 3

Regulárne výrazy pomocou Pythonu 3
Regulárne výrazy sa často považujú za skutočne nejasnú sériu hieroglyfov, ktoré si človek zvyčajne skopíruje z internetu a vloží do svojho kódu. Toto záhadné kúzlo potom ukazuje magické schopnosti hľadania vzorov vo vnútri reťazcov textu a ak sa ho pekne spýtame, urobí nám dokonca výhodu, že daný vzor v reťazci nahradíme niečím krajším.

Napríklad, keď píšete obslužné rutiny pre adresu URL (a Boh vám pomôže, ak píšete úplne od začiatku), často chcete zobraziť rovnaký výsledok bez ohľadu na koncovú značku „/“ v adrese URL. E.g https: // príklad.príklad com / user / settings / a https: //.com / user / settings by mali oba smerovať na rovnakú stránku aj napriek koncovému znaku „/“. 

Nemôžete však ignorovať všetky lomítka, napríklad:

  1. Priame lomítko medzi „používateľom“ a „nastaveniami“, e, „používateľ / nastavenia“.
  2. Tiež budete musieť vziať do úvahy znak „//“ na začiatku vášho FQDN, za ktorým nasleduje znak „https“.

Takže, prídete s pravidlom ako: „Ignorujte iba lomítka, za ktorými nasleduje prázdne miesto.„A ak chcete, môžete toto pravidlo zakódovať pomocou série príkazov typu„ ak-iné “. To však bude dosť rýchlo ťažkopádne. Môžete napísať funkciu s názvom cleanUrl (), ktorá to za vás môže zapuzdriť. Ale vesmír na vás čoskoro začne hádzať viac kriviek. Čoskoro sa ocitnete v písaní funkcií pre cleanHeaders (), processLog () atď. Alebo môžete použiť regulárny výraz vždy, keď sa vyžaduje akýkoľvek druh zhody vzorov.

Štandardné IO a súbory

Predtým, ako sa dostaneme do podrobností regulárnych výrazov, stojí za zmienku model, ktorý má väčšina systémov pre toky textu. Tu je krátke (neúplné) zhrnutie:

  1. Text sa spracováva ako (jeden) prúd znakov.
  2. Tento prúd môže pochádzať zo súboru textu v kódovaní Unicode alebo ASCII alebo zo štandardného vstupu (klávesnica) alebo zo vzdialeného sieťového pripojenia. Po spracovaní, povedzme skriptom regex, výstup buď ide do súborového alebo sieťového toku alebo na štandardný výstup (napr.g, konzola)
  3. Prúd pozostáva z jedného alebo viacerých riadkov. Každý riadok má nula alebo viac znakov, za ktorými nasleduje nový riadok.

Kvôli jednoduchosti chcem, aby ste si predstavili, že súbor sa skladá z riadkov končiacich znakom nového riadku. Tento súbor rozdelíme na jednotlivé riadky (alebo reťazce), z ktorých každý končí buď novým riadkom, alebo normálnym znakom (pre posledný riadok).

Regulárne výrazy a reťazec

Regulárny výraz nemá nič spoločné so súbormi. Predstavte si to ako čiernu skrinku, ktorá môže brať ako vstup ľubovoľný reťazec ľubovoľnej (konečnej) dĺžky a akonáhle sa dostane na koniec tohto reťazca, môže buď:

  1. Prijmite reťazec. Inými slovami reťazec zápasy regulárny výraz (regulárny výraz).
  2. Odmietnite reťazec, t.j.e, reťazec nie zápas regulárny výraz (regulárny výraz).

Napriek svojej čiernej skrinke pridám do tohto stroja ešte niekoľko ďalších obmedzení. Regulárny výraz číta reťazec postupne, zľava doprava a číta naraz iba jeden znak. Takže šnúrka „LinuxHint“ sa dá čítať ako:

'L "i" n "u" x "H" i "n" t' [zľava doprava]

Začnime jednoducho

Najjednoduchším typom regulárneho výrazu by bolo hľadať a porovnávať reťazec „C“. Regulárny výraz pre toto slovo je iba „C“. Celkom triviálne. Spôsob, ako to urobiť v Pythone, si vyžaduje, aby ste najskôr importovali súbor re modul pre regulárne výrazy.

>>> import re

Potom použijeme funkciu re.Vyhľadávanie(vzor, ​​šnúrka) kde vzor je náš regulárny výraz a struna vo vstupnom reťazci, v rámci ktorého hľadáme vzor.

>>> re.hľadať („C“, „Táto veta obsahuje zámerné C“)

Funkcia prevezme vzor 'C', vyhľadá ho vo vstupnom reťazci a vytlačí umiestnenie (span) kde sa uvedený vzor nachádza. Táto časť reťazca, tento podreťazec je to, čo sa zhoduje s našim regulárnym výrazom. Ak by takáto zhoda nebola nájdená, výstup by bol a Žiadne objekt.

Podobne môžete vyhľadávať vzor „regulárny výraz“ takto:

>>> re.vyhľadávanie („regulárny výraz“, „Na hľadanie vzorov môžeme použiť regulárne výrazy.”)

re.hľadať (), znovu.match () a re.fullmatch ()

Tri užitočné funkcie modulu re zahŕňajú:

1.  re.Vyhľadávanie(vzor, ​​šnúrka)

Týmto sa vráti späť podreťazec, ktorý zodpovedá vzoru, ako sme videli vyššie. Ak sa nenájde žiadna zhoda, potom Žiadne sa vracia. Ak viac podreťazcov zodpovedá danému vzoru, nahlási sa iba prvý výskyt.

2.  re.zápas(vzor, ​​šnúrka)

Táto funkcia sa snaží zosúladiť dodaný vzor od začiatku reťazca. Ak niekde v polovici natrafí na prestávku, vráti sa Žiadne.

Napríklad,

>>> re.zápas („Joh“, „John Doe“)

Kde ako reťazec „Moje meno je John Doe“ nie je zhoda, a teda Žiadne sa vracia.

>>> tlač (re.zápas („Joh“, „Volám sa John Doe“))
Žiadne

3.  re.úplná zhoda (vzor, ​​šnúrka)

Je to prísnejšie ako vyššie uvedené a pokúša sa nájsť presnú zhodu vzoru v reťazci, inak je predvolené Žiadne.

>>> tlač (re.úplná zhoda („Joh“, „Joh“))

# Čokoľvek iné sa nebude zhodovať

Budem používať iba re.Vyhľadávanie() vo zvyšku tohto článku. Kedykoľvek, keď hovorím, že regulárny výraz prijme tento reťazec, znamená to, že re.Vyhľadávanie() Funkcia našla vo vstupnom reťazci vyhovujúci podreťazec a namiesto Žiadneobjekt.

Špeciálne znaky

Regulárne výrazy ako „John“ a „C“ nie sú veľmi užitočné. Potrebujeme špeciálne znaky, ktoré konkrétny znamená v kontexte regulárnych výrazov. Tu je niekoľko príkladov:

    1. ^ - Zhoduje sa so začiatkom reťazca. Napríklad „^ C“ sa bude zhodovať so všetkými reťazcami, ktoré sa začínajú písmenom C.
    2. $ - zhoduje sa s koncom riadku.
    3. . - Bodka označuje jeden alebo viac znakov, okrem nového riadku.
    4. * - Toto je nula alebo viac znakov toho, čo tomu predchádzalo. Takže b * zodpovedá 0 alebo viacerým výskytom b. ab * sa zhoduje iba s a, ab a a
    5. + - Týka sa to jedného alebo viacerých znakov toho, čo tomu predchádzalo. Takže b + zodpovedá 1 alebo viacerým výskytom b. ab * sa zhoduje iba s a, ab a a
    6. \ - Spätné lomítko sa používa ako úniková sekvencia v regulárnych výrazoch. Takže chcete regulárny výraz, ktorý namiesto konca riadku vyhľadáva doslovnú prítomnosť symbolu dolára „$“. Môžete písať \ $ v regulárnom výraze.
    7. Pomocou zložených zátvoriek môžete určiť počet opakovaní, ktoré chcete vidieť. Napríklad vzor ako ab 10 znamená reťazec a za ním bude nasledovať 10 b. Môžete tiež určiť rozsah čísel, napríklad b 4,6 sa zhoduje s reťazcami obsahujúcimi b, ktoré sa opakujú 4 až 6 krát za sebou. Vzor pre 4 alebo viac opakovaní by vyžadoval iba koncovú čiarku, napríklad b 4,
    8. Hranaté zátvorky a rozsah znakov. RE like [0-9] môže pôsobiť ako zástupný symbol pre ktorúkoľvek číslicu od 0 do 9. Podobne môžete mať číslice medzi jednou a piatou [1-5] alebo pre zhodu s akýmkoľvek veľkým písmenom [A-Z] alebo pre akékoľvek písmeno abecedy bez ohľadu na to, či ide o veľké alebo malé písmeno [A-z].
      Napríklad ľubovoľný reťazec vyrobený z presne desiatich číslic sa zhoduje s regulárnym výrazom [0-9] 10, čo je celkom užitočné, keď hľadáte telefónne čísla v danom reťazci.
    9. Príkaz ALEBO môžete vytvoriť pomocou | znak, v ktorom je regulárny výraz tvorený dvoma alebo viacerými regulárnymi výrazmi, povedzme A a B. Regulárny výraz A | B je zhoda, ak je vstupný reťazec zhoda pre regulárny výraz A alebo pre B.
    10. Môžete zoskupiť rôzne regulárne výrazy. Napríklad regex (A | B) C bude zodpovedať regexom pre AC a

Je toho ešte veľa, čo by ste mali pokryť, ale odporúčam vám učiť sa za pochodu, namiesto preťaženia mozgu množstvom obskúrnych symbolov a okrajových prípadov. Ak máte pochybnosti, dokumenty Python sú skvelým pomocníkom a teraz viete dosť na to, aby ste ich mohli ľahko sledovať.

Ruky na skúsenosti a referencie

Ak chcete vidieť vizuálnu interpretáciu vášho regulárneho výrazu, môžete navštíviť Debuggex. Táto stránka generuje zobrazenie vášho regulárneho výrazu v reálnom čase a umožňuje vám ho otestovať proti rôznym vstupným reťazcom.

Ak sa chcete dozvedieť viac o teoretických aspektoch regulárnych výrazov, mali by ste sa pozrieť na prvých pár kapitol Úvod do teórie výpočtu od Michaela Sipsera. Je veľmi ľahké ho sledovať a ukazuje dôležitosť regulárnych výrazov ako základného konceptu samotného výpočtu!

Hry Výukový program OpenTTD
Výukový program OpenTTD
OpenTTD je jednou z najpopulárnejších obchodných simulačných hier. V tejto hre musíte vytvoriť úžasné dopravné podnikanie. Začnete však na začiatku ok...
Hry SuperTuxKart pre Linux
SuperTuxKart pre Linux
SuperTuxKart je vynikajúci titul navrhnutý tak, aby vám priniesol zážitok z hry Mario Kart zadarmo na vašom systéme Linux. Je to dosť náročné a zábavn...
Hry Výukový program Battle for Wesnoth
Výukový program Battle for Wesnoth
Battle for Wesnoth je jednou z najpopulárnejších open source strategických hier, ktoré si v súčasnosti môžete zahrať. Táto hra bola nielen vyvinutá ve...