[python] re

Petr Prikryl PrikrylP na skil.cz
Čtvrtek Únor 16 08:33:19 CET 2006


Jan Janech
> In [1]: import re
> 
> In [2]: re.match("^(.)(.)$", "aa") != None
> Out[2]: True
> In [3]: re.match("^(.)(.)$", "aa").groups()
> Out[3]: ('a', 'a')
> In [4]: re.match("^(?:.)(?:.)$", "aa") != None
> Out[4]: True
> In [5]: re.match("^(?:.)(?:.)$", "aa").groups()
> Out[5]: ()

Chtěl bych upozornit na jednu důležitou drobnost,
která je v Pythonu často příčinou toho, že regulární
výrazy nefungují podle očekávání. 

Řetězce popisující regulární výrazy je lepší VŽDY
zapisovat jako "raw", tedy "surové" (ve významu surovina).
Česky to znamená, že se při překladu pythonovského
zdrojáku neinterpretují posloupnosti začínající zpětnými 
lomítky (escape sekvence) a všechna zpětná lomítka
se stanou součástí předpisu pro kompilaci regulárního
výrazu. 

Raw řetězce zapisujeme tak, že před úvodní uvozovku
nebo apostrof přidáme písmeno er  r'takto' nebo r"takto".
Pokud na ti zapomeneme, pak například vzorek pro náhradu
zapsaný jako "\1 text \2" nezpůsobí vložení dvou 
nalezených skupin, ale vložení znaků s kódem 1 a 2
(někdy se zobrazují jako takové ty obličeje, co se nám
vysmívají). Není to chyba Pythonu, ale "chyba hlávky".
 
V jiných jazycích se z tohoto důvodu pro zápis 
regulárních výrazů používají jiné omezovače, například
normální lomítka (sed, awk, perl, JavaScript,...).

pepr




Další informace o konferenci Python