Regulární výrazy

Co jsou regulární výrazy

Regulární výraz (regular expression – neplést s regulérním) je řetězec znaků se speciálním významem, které slouží jako předpis pro vyhledávání kusů textu. Pokud regulární výrazy neznáte, pak si je před čtením této kapitoli nejdříve nastudujte (třeba z www.regularnivyrazy.info), protože tato kapitola nepopisuje regulární výrazy, ale jen jak se dají použít v Pythonu.

Modul re

Ve standardní knihovně Pythonu je modul re, který má na starosti regulární výrazy. Funkce z tohoto modulu a objekty, které vracejí, jsou předmětem této kapitoly.

Nejjednoduší na použití je funkce search(), která, jak název napovídá, hledá v textu schody s regulárním výrazem. Metoda vrátí objekt _sre.SRE_Match (match objekt), který obsahuje první (a jedinou) nalezenou schodu. Pokud search() schodu nenajde, vrací None.

>>> import re
>>> m = re.search('eggs?', 'egg and egg are two eggs')
>>> m.group(0)
'egg'
>>> m.start(), m.end()  # indexy zacatku a konce nalezene skupiny
(0, 3)

Funkce match() funguje stejně jako search(), jen vyžaduje, aby hledaný vzor začínal na začátku prohledávaného řetězce.

>>> import re
>>> m = re.search('egg', 'xegg')
>>> m.group(0)
'egg'
>>> m = re.match('egg', 'xegg')    # vrací None
>>> type(m)
<type 'NoneType'>

Funkce findall() nalezne všechny schody v řetězci a vrátí je jako seznam.

>>> import re
>>> m = re.findall('eggs?', 'egg and egg are two eggs')
>>> m
['egg', 'egg', 'eggs']

Funkce split() rozdělí řetězec podle regulárního výrazu.

>>> re.split('\W+', 'Words, words, words.')
['Words', 'words', 'words', '']

Kompilace regulárních výrazů

Funkce compile() modulu re slouží k vytvoření objektu regulárního výrazu z řetězce regulárního výrazu. Používání tohoto objektu namísto řetězce značně urychluje program. Kdykoliv budete nějaký regulární výraz používat více než jednou, nejdříve si jej zkomiplujte.

Zkompilovaný objekt můžete používat namísto textového řetězce. Navíc má i vlastní užitečné metody.

>>> import re
>>> pattern = re.compile('eggs?')
>>> m = re.search(pattern, 'egg and egg are two eggs')
>>> m.group(0)
'egg'
>>> m.start(), m.end()  # indexy zacatku a konce nalezene skupiny
(0, 3)
>>> m = re.findall(pattern, 'egg and egg are two eggs')
>>> m
['egg', 'egg', 'eggs']

Zkompilovaný objekt obsahuje metody, které dělají totéž co funkce z modulu re. Jejich smyslem je jen ušetřit psaní. Následující dva výrazy jsou totožné.

re.findall(pattern, 'egg and egg are two eggs')
pattern.findall('egg and egg are two eggs')

Match objekt

Match objekt, který vrací například funkce re.search() nebo re.match() má několik užitečných metod a atributů. Nejdůležitější je určitě metoda group().

>>> m = re.match(r"(?P<jmeno>\w+) (?P<prijmeni>\w+)", "Malcolm Reynolds")
>>> type(m)                  # match objekt
<type '_sre.SRE_Match'>
>>> m.group('jmeno')
'Malcolm'
>>> m.group(0)
'Malcolm Reynolds'
>>> m.group(2)
'Reynolds'
>>> m.group('jmeno', 'prijmeni')
('Malcolm', 'Reynolds')
>>> m.groups()
('Malcolm', 'Reynolds')
Komentář Hlášení chyby
Created: 11.9.2005
Last updated: 1.9.2015
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..