Možno poznáte vyhľadávanie textu stlačením Ctrl-F a zadaním hľadaných slov. Regulárne výrazy idú ešte o krok ďalej: Umožňujú vám určiť vzor textu, ktorý sa má hľadať. V tomto článku uvidíme, ako funguje porovnávanie vzorov v Pythone s Regexom.
Regex v Pythone
Regulárne výrazy , tiež nazývaný regulárny výraz , sú popisy vzoru textu. Dokáže zistiť prítomnosť alebo neprítomnosť textu jeho priradením k určitému vzoru a tiež môže rozdeliť vzor do jedného alebo viacerých podvzorov. Napríklad a d v regulárnom výraze znamená číslicu – to znamená akúkoľvek jednu číslicu medzi 0 a 9.
Skontrolujte telefónne čísla pomocou regulárneho výrazu v Pythone
Nasledujúci regulárny výraz sa používa v Python na priradenie reťazca troch čísel, spojovníka, troch ďalších čísel, ďalšej spojovníka a štyroch čísel.
Any other string would not match the pattern. ddd-ddd-dddd>
Regulárne výrazy môžu byť oveľa sofistikovanejšie. Napríklad pridanie 3 v zložených zátvorkách ({3}) za vzor je ako povedať: Zhodujte tento vzor trikrát. Takže o niečo kratší regulárny výraz je nasledujúci:
herec chiranjeevi
d{3}-d{3}-d{4}> Zodpovedá správnemu formátu telefónneho čísla.
Zhoda vzorov s regulárnymi výrazmi
Objekt Regex Vyhľadávanie() metóda hľadá reťazec, ktorý je odovzdaný, a hľadá všetky zhody s regulárnym výrazom. Zhodné objekty majú metódu group(), ktorá vráti skutočný zhodný text z hľadaného reťazca. Môžete tiež vidieťRegex cheetsheetPre viac informácií.
Príklad: Importujte modul regulárneho výrazu pomocou importu re. Vytvorte objekt Regex sre.compile()funkciu. (Nezabudnite použiť nespracovaný reťazec.) Zadajte reťazec, ktorý chcete vyhľadať, do metódy search() objektu Regex. Toto vráti objekt Match. Ak chcete vrátiť reťazec skutočného zhodného textu, zavolajte metódu group() objektu Match.
Python3
# Python program to illustrate> # Matching regex objects> import> re> > # regex object> phoneNumRegex>=> re.>compile>(r>'ddd-ddd-dddd'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(>'Phone number found: '> +> mo.group())> |
>
>
Výkon:
Phone number found: 415-555-4242>
Zátvorky pre zoskupovanie a zachytávanie pomocou regulárneho výrazu
Jedným zo spôsobov zhody vzorov s Regex je použitie zátvoriek okolo vzorov. Pozrime sa na niekoľko rôznych príkladov pre lepšie pochopenie.
Zodpovedajúce objekty
Povedzme, že chcete oddeliť predvoľbu od zvyšku telefónneho čísla. Pridaním zátvoriek sa vytvoria skupiny v regulárnom výraze: (ddd)-(ddd-dddd). Potom môžete použiť metódu group() match object na získanie zodpovedajúceho textu len z jednej skupiny.
Python3
import> re> phoneNumRegex>=> re.>compile>(r>'(ddd)-(ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(mo.group(>1>))> areaCode, number>=> mo.groups()> print>(>'area code:'>, areaCode)> print>(>'number:'>, number)> |
>
>
Výkon:
415 area code: 415 number: 555-4242>
Získajte všetky skupiny naraz
Ak by ste chceli získať všetky skupiny naraz, použite metódu groups(), – všimnite si množné číslo názvu.
Python3
import> re> phoneNumRegex>=> re.>compile>(r>'(ddd)-(ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(mo.groups())> |
>
mycricketlive
>
Výkon:
('415', '555-4242')> Priraďte zátvorku
Zátvorky majú v regulárnych výrazoch osobitný význam, ale čo robiť, ak potrebujete v texte nájsť zhodu so zátvorkami. Telefónne čísla, ktoré sa pokúšate nájsť, môžu mať napríklad v zátvorkách nastavenú predvoľbu. V tomto prípade musíte znaky ( a ) escapovať spätnou lomkou. Do interaktívneho shellu zadajte nasledovné:
Python3
import> re> phoneNumRegex>=> re.>compile>(r>'((ddd)) (ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My phone number is (415) 555-4242.'>)> print>(mo.group(>1>))> |
>
>
Výkon:
(415)>
Znaky escape ( a ) v surovom reťazci odovzdanom do re.compile() sa budú zhodovať so skutočnými zátvorkami.
Regulárne výrazy: Zoskupovanie a znak potrubia
The | znak sa nazýva fajka. Môžeme ho použiť kdekoľvek, kde chceme nájsť zhodu s jedným z mnohých výrazov.
Príklad: Regulárny výraz r’Batman|Tina Fey’ sa bude zhodovať s výrazom ‘Batman’ alebo ‘Tina Fey’. Keď sa v hľadanom reťazci vyskytne Batman aj Tina Fey, prvý výskyt zhodného textu sa vráti ako objekt Match.
Python3
# Python program to illustrate> # Matching regex objects> # with multiple Groups with the Pipe> import> re> heroRegex>=> re.>compile> (r>'Batman|Tina Fey'>)> mo1>=> heroRegex.search(>'Batman and Tina Fey.'>)> print>(mo1.group())> |
>
>
Výkon:
'Batman'>
Pochopenie kučeravých zátvoriek v Regexe
Ak máme skupinu, ktorú chceme zopakovať presne stanovený počet krát, nasledujte skupinu v regulačnom výraze s číslom v zložených zátvorkách.
Napríklad regulárny výraz (Ha){3} sa bude zhodovať s reťazcom „HaHaHa“, ale nebude sa zhodovať s reťazcom „HaHa“, pretože druhý má iba dve opakovania skupiny (Ha). Namiesto jedného čísla môžete zadať rozsah medzi zloženými zátvorkami. Regulárny výraz (Ha){3, 5} sa bude zhodovať s „HaHaHa“, „HaHaHaHa“ a „HaHaHaHaHa“. Môžete tiež vynechať prvé alebo druhé číslo v zložených zátvorkách, aby bolo minimum alebo maximum neohraničené. (Ha){3, } bude zodpovedať trom alebo viacerým inštanciám skupiny (Ha), zatiaľ čo (Ha){, 5} bude zodpovedať nula až päť inštancií. Zložené zátvorky môžu pomôcť skrátiť vaše regulárne výrazy.
Príklad 1: V tomto príklade použijeme zložené zátvorky na určenie výskytu vzoru, ktorý hľadáme.
Python3
# Python program to illustrate> # Matching Specific Repetitions> # with Curly Brackets> import> re> haRegex>=> re.>compile>(r>'(Ha){3}'>)> mo1>=> haRegex.search(>'HaHaHa'>)> print>(mo1.group())> |
>
>
rozdiel medzi poľom a zoznamom polí
Výkon:
HaHaHa>
Príklad 2: V tomto príklade zadefinujeme výskyt vzoru pomocou zložených zátvoriek a potom vyhľadáme, či v ňom konkrétny vzor existuje alebo nie.
Python3
# Python program to illustrate> # Matching Specific Repetitions> # with Curly Brackets> import> re> haRegex>=> re.>compile>(r>'(Ha){3}'>)> mo2>=> haRegex.search(>'Ha'>)>=>=> None> print>(mo2)> |
>
>
Výkon:
True>
Voliteľný operátor alebo otáznik (?) v regulárnom výraze
Niekedy existuje vzor, ktorý chcete priradiť iba voliteľne. To znamená, že regulárny výraz by mal nájsť zhodu bez ohľadu na to, či tam daný kúsok textu je alebo nie. The ? znak označí skupinu, ktorá mu predchádza, ako voliteľnú časť vzoru.
Príklad 1: Tu budeme hľadať vzor so vzorom „Batman“ alebo „Batwoman“. The (kde)? časť regulárneho výrazu znamená, že vzor wo je voliteľná skupina. Regulárny výraz sa bude zhodovať s textom, ktorý má nula výskytov alebo jeden výskyt wo. To je dôvod, prečo sa regulárny výraz zhoduje s výrazmi „Batwoman“ aj „Batman“. Môžete myslieť na ? ako sa hovorí, skupiny Zhoduje sa s nulou alebo jednou zo skupín pred týmto otáznikom.
Ak potrebujete nájsť zhodu so skutočným znakom otáznika, ukončite ho znakom ?.
Python3
# Python program to illustrate> # optional matching> # with question mark(?)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)?man'>)> mo1>=> batRegex.search(>'The Adventures of Batman'>)> mo2>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo1.group())> print>(mo2.group())> |
>
>
Výkon:
Batman Batwoman>
Nula alebo viac vzorov zhodujúcich sa s hviezdou
Symbol * (nazývaný hviezda alebo hviezdička) znamená zodpovedať nule alebo viac — skupina, ktorá predchádza hviezdičku, sa môže v texte vyskytovať koľkokrát. Môže úplne chýbať alebo sa môže opakovať znova a znova. Ak potrebujete nájsť zhodu so skutočným znakom hviezdičky, pred hviezdičku v regulárnom výraze uveďte opačnú lomku, *.
Príklad 1: V tomto príklade porovnáme nulové výskyty vzoru v reťazci. Časť (wo)* regulárneho výrazu sa zhoduje s nulovým výskytom wo v reťazci.
Python3
# Python program to illustrate> # matching a regular expression> # with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo1>=> batRegex.search(>'The Adventures of Batman'>)> print>(mo1.group())> |
>
>
Výkon:
Batman>
Príklad 2: V tomto príklade porovnáme aspoň jeden výskyt vzoru v reťazci.
Python
príklady binárnych stromov
#python program to illustrate> #matching a regular expression> #with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo2>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo2.group())> |
>
>
Výkon:
Batwoman>
Príklad 3: V tomto príklade priradíme viac ako jeden výskyt vzoru v reťazci.
Python
# Python program to illustrate> # matching a regular expression> # with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo3>=> batRegex.search(>'The Adventures of Batwowowowoman'>)> print>(mo3.group())> |
>
>
Výkon:
Batwowowowoman>
Zhoda jedného alebo viacerých vzorov s plusom
Zatiaľ čo * znamená zodpovedať nule alebo viac , znamená + (alebo plus). zhodovať sa s jedným alebo viacerými. Na rozdiel od hviezdičky, ktorá nevyžaduje, aby sa jej skupina objavila v zodpovedajúcom reťazci, skupina predchádzajúca plus sa musí objaviť aspoň raz. Nie je to voliteľné. Ak potrebujete nájsť zhodu so skutočným znakom plus, pridajte pred znamienko plus opačnú lomku, aby ste ho opustili: +.
Príklad 1: V tomto príklade porovnáme aspoň jeden výskyt vzoru v reťazci.
Python3
# Python program to illustrate> # matching a regular expression> # with plus(+)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)+man'>)> mo1>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo1.group())> |
>
>
Výkon:
Batwoman>
Príklad 2: V tomto príklade sa regulárny výraz Bat(wo)+man nebude zhodovať s reťazcom „The Adventures of Batman“, pretože znamienko plus vyžaduje aspoň jedno wo.
hrithik rošanský vek
Python
# Python program to illustrate> # matching a regular expression> # with plus(+)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)+man'>)> mo3>=> batRegex.search(>'The Adventures of Batman'>)>=>=> None> print>(mo3)> |
>
>
Výkon:
True>
Súvisiaci článok – Regex Cheetsheet