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
.
>>> 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.
>>> 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.
>>> 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.
['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.
>>> 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é.
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()
.
>>> 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')