Možná znáte vyhledávání textu stisknutím ctrl-F a zadáním slov, která hledáte. Regulární výrazy jdou ještě o krok dále: Umožňují určit vzor textu, který se má hledat. V tomto článku uvidíme, jak funguje párování vzorů v Pythonu s Regex.
Regex v Pythonu
Regulární výrazy , také zvaný regulární výraz , jsou popisy vzoru textu. Dokáže detekovat přítomnost nebo nepřítomnost textu jeho porovnáváním s konkrétním vzorem a také může rozdělit vzor na jeden nebo více dílčích vzorů. Například a d v regulárním výrazu znamená číslici – tedy jakoukoli jednotlivou číslici mezi 0 a 9.
Zkontrolujte telefonní čísla pomocí Regex v Pythonu
Následující regulární výraz se používá v Krajta chcete-li porovnat řetězec tří čísel, pomlčku, tři další čísla, další pomlčku a čtyři čísla.
Any other string would not match the pattern. ddd-ddd-dddd>
Regulární výrazy mohou být mnohem sofistikovanější. Například přidání 3 ve složených závorkách ({3}) za vzor je jako říct: Shodujte tento vzor třikrát. Takže o něco kratší regulární výraz je následující:
abstraktní třída Java
d{3}-d{3}-d{4}> Odpovídá správnému formátu telefonního čísla.
Shoda vzorů s regulárními výrazy
Objekt Regex Vyhledávání() metoda hledá řetězec, který je předán, a hledá všechny shody s regulárním výrazem. Shodné objekty mají metodu group(), která vrátí skutečný odpovídající text z hledaného řetězce. Můžete také vidětRegex cheetsheetPro více informací.
Příklad: Importujte modul regulárních výrazů pomocí importu re. Vytvořte objekt Regex sre.compile()funkce. (Nezapomeňte použít nezpracovaný řetězec.) Předejte řetězec, který chcete prohledat, do metody search() objektu Regex. To vrátí objekt Match. Voláním metody group() objektu Match vrátíte řetězec skutečného shodného textu.
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ýstup:
Phone number found: 415-555-4242>
Závorky pro seskupování a zachycení pomocí Regex
Jedním ze způsobů porovnávání vzorů s Regex je použití závorek kolem vzorů. Podívejme se na několik různých příkladů pro lepší pochopení.
Odpovídající objekty
Řekněme, že chcete oddělit směrové číslo oblasti od zbytku telefonního čísla. Přidáním závorek vytvoříte skupiny v regulárním výrazu: (ddd)-(ddd-dddd). Potom můžete použít metodu group() match object k získání shodného textu pouze z jedné 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ýstup:
415 area code: 415 number: 555-4242>
Získejte všechny skupiny najednou
Pokud byste chtěli načíst všechny skupiny najednou, použijte metodu groups(), – všimněte si množného čísla názvu.
Python3
import> re> phoneNumRegex>=> re.>compile>(r>'(ddd)-(ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(mo.groups())> |
>
>
Výstup:
('415', '555-4242')> Spojte závorku
Závorky mají v regulárních výrazech zvláštní význam, ale co dělat, když potřebujete v textu najít shodu se závorkami. Například telefonní čísla, která se pokoušíte najít, mají v závorkách nastavenou předvolbu. V tomto případě musíte znaky ( a ) escapovat zpětným lomítkem. Do interaktivního shellu zadejte následující:
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ýstup:
(415)>
Znaky escape ( a ) v nezpracovaném řetězci předaném re.compile() budou odpovídat skutečným závorkám.
Regulární výrazy: Seskupování a znak potrubí
The | znak se nazývá dýmka. Můžeme jej použít kdekoli, kde chceme najít shodu s jedním z mnoha výrazů.
Příklad: Regulární výraz r‘Batman|Tina Fey‘ bude odpovídat buď ‚Batman‘ nebo ‚Tina Fey‘. Když se v hledaném řetězci objeví Batman i Tina Fey, první výskyt shodného textu bude vrácen jako objekt Match.
Python3
deterministické konečné automaty
# 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())> |
>
>
10 z 50,00
Výstup:
'Batman'>
Pochopení složených závorek v Regex
Pokud máme skupinu, kterou chceme opakovat určitý počet opakování, následujte skupinu v regulárním výrazu s číslem ve složených závorkách.
Například regulární výraz (Ha){3} bude odpovídat řetězci „HaHaHa“, ale nebude odpovídat „HaHa“, protože druhý má pouze dvě opakování skupiny (Ha). Místo jednoho čísla můžete zadat rozsah mezi složenými závorkami. Regulární výraz (Ha){3, 5} bude odpovídat „HaHaHa“, „HaHaHaHa“ a „HaHaHaHaHa“. Můžete také vynechat první nebo druhé číslo ve složených závorkách a nechat minimum nebo maximum neomezené. (Ha){3, } bude odpovídat třem nebo více instancím skupiny (Ha), zatímco (Ha){, 5} bude odpovídat nule až pěti instancím. Složené závorky mohou pomoci zkrátit vaše regulární výrazy.
Příklad 1: V tomto příkladu použijeme složené závorky k určení výskytu vzoru, který hledá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())> |
>
>
Výstup:
HaHaHa>
Příklad 2: V tomto příkladu definujeme výskyt vzoru pomocí složených závorek a poté vyhledáme, zda v něm konkrétní vzor existuje nebo ne.
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ýstup:
True>
Volitelný operátor nebo otazník (?) v regulárním výrazu
Někdy existuje vzor, který chcete spárovat pouze volitelně. To znamená, že regulární výraz by měl najít shodu bez ohledu na to, zda tam daný kousek textu je nebo ne. The ? znak označí skupinu, která mu předchází, jako volitelnou součást vzoru.
Příklad 1: Zde budeme hledat vzor se vzorem ‚Batman‘ nebo ‚Batwoman‘. The (kde)? část regulárního výrazu znamená, že vzor wo je volitelná skupina. Regulární výraz bude odpovídat textu, který má nula výskytů nebo jeden výskyt wo. To je důvod, proč se regulární výraz shoduje s výrazy „Batwoman“ i „Batman“. Můžete myslet na ? jak se říká, skupiny Odpovídají nule nebo jedné ze skupin před tímto otazníkem.
Pokud potřebujete najít shodu se skutečným znakem otazníku, ukončete jej pomocí ?.
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ýstup:
Batman Batwoman>
Nula nebo více vzorů odpovídající hvězdě
Symbol * (tzv. hvězdička nebo hvězdička) znamená odpovídat nule nebo více — skupina před hvězdičkou se může v textu vyskytovat kolikrát. Může zcela chybět nebo se může opakovat znovu a znovu. Pokud potřebujete najít shodu se skutečným znakem hvězdičky, přidejte před hvězdu v regulárním výrazu zpětné lomítko, *.
Příklad 1: V tomto příkladu porovnáme nulové výskyty vzoru v řetězci. Část (wo)* regulárního výrazu odpovídá nule výskytů wo v řetězci.
Python3
číslo 'euler' v jazyce Java'
# 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ýstup:
Batman>
Příklad 2: V tomto příkladu porovnáme alespoň jeden výskyt vzoru v řetězci.
Krajta
#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ýstup:
Batwoman>
Příklad 3: V tomto příkladu porovnáme více než jeden výskyt vzoru v řetězci.
Krajta
# 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ýstup:
Batwowowowoman>
Shoda jednoho nebo více vzorů s plusem
Zatímco * prostředek odpovídat nule nebo více , znamená + (nebo plus). odpovídat jednomu nebo více. Na rozdíl od hvězdičky, která nevyžaduje, aby se její skupina objevila ve shodném řetězci, se skupina před znaménkem plus musí objevit alespoň jednou. Není to volitelné. Pokud potřebujete najít shodu se skutečným znakem plus, před znaménko plus jej uzavřete zpětným lomítkem: +.
Příklad 1: V tomto příkladu porovnáme alespoň jeden výskyt vzoru v řetězci.
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ýstup:
Batwoman>
Příklad 2: V tomto příkladu se regulární výraz Bat(wo)+man nebude shodovat s řetězcem „The Adventures of Batman“, protože znaménko plus vyžaduje alespoň jedno wo.
„co je 10 ze 100“
Krajta
# 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ýstup:
True>
Související článek – Regex Cheetsheet