[python] Zvláštní chování regulárnich výrazů

Petr Messner petr.messner na gmail.com
Pondělí Květen 18 12:31:15 CEST 2009


Ahoj,

http://docs.python.org/library/re.html

ty flagy tam dáváte špatně, funkce re.sub žádné flagy nebere. Viz help(re.sub).

Řešením by mohlo být tam ten flag dát jinak, např. (?s):
re.sub(r'(?s)\*\*(.*)\*\*', r'<strong>\1</strong>', text)

Nebo ten regulární výraz zkompilovat (metoda re.compile flagy
akceptuje) a používat patřičnou metodu vzniklého objektu.

> A ještě jeden dotaz. V dokumentaci se zmiňují o metodě 'compile()', díky
> níž se budou výrazy provádět rychleji. Jak moc se aplikace zrychlí,
> případně jak to použít?

O kolik se zrychlí záleží na složitosti výrazu a na počtu použití.
Pokud bude použit jen jednou, nemá "předkompilace" smysl. Pokud se
ovšem bude vyskytovat v nějakém hodně prováděném kusu kódu,
předkompilováním rozhodně nic nezkazíte.

Předkompilací vyhodnocování výrazu neurychlíte, jen se vyhnete další
kompilaci (vytvoření automatu) při dalším použití.

A ten flag multiline je myslím zbytečný, asi dělá něco jiného, než si
představujete.

PM

2009/5/18 Vasco <vasco.vls na gmail.com>:
> Zdravím,
> měl bych dotaz na zvláštní chování regulárních výrazů, které si neumím
> vysvětlit.
>
> Mám následující kód:
>
> # -*- coding: utf-8 -*-
> import re
>
> flags = re.UNICODE | re.LOCALE | re.MULTILINE | re.DOTALL
> text = u'Příšerně **žluťoučký\nkůň úpěl ďábelské\ntóny!**'
> text2 = u'Příšerně **žluťoučký kůň úpěl ďábelské tóny!**'
> print 'Text\t', re.sub(r'\*\*(.+?)\*\*', r'<strong>\1</strong>', text,
> flags)
> print 'Text2\t', re.sub(r'\*\*(.+?)\*\*', r'<strong>\1</strong>', text2,
> flags)
>
> I přes to, že jsem nastavil MULTILINE a DOTALL, se první text, který
> obsahuje \n nezobrazí správně. Když ale z řetězce vymažu znaky pro nový
> řádek, regulární výraz funguje.
>
> Přitom v dokumentaci je napsáno, že pokud je nastaven DOTALL, bude '.'
> brát všechny znaky, včetně \n.
>
> Jak by tedy měl správně vypadat výše napsaný regulární výraz?
>
> A ještě jeden dotaz. V dokumentaci se zmiňují o metodě 'compile()', díky
> níž se budou výrazy provádět rychleji. Jak moc se aplikace zrychlí,
> případně jak to použít?
>
> Díky,
> Vlastimil S.
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>


Další informace o konferenci Python