[python] Greedy regexp
David Rohleder
davro na ics.muni.cz
Pátek Únor 26 17:38:47 CET 2010
Vasco píše v Čt 25. 02. 2010 v 21:38 +0100:
> Zdravím,
>
> zrovna se hraju v Pythonu s regexp a narazil jsem na menší zádrhel. Mám
> následující řetězec:
>
> "<a>One <a>Two</a> Three</a> <a>Four</a>"
>
> A následující regexp:
>
> "<(?P<name>\w+)>(?P<text>.*?)</(?P=name)>"
>
> Když to proženu přes 'search', dostanu pro první nalezený výraz tohle:
>
> "One <a>Two"
>
> Ale očekával bych spíše:
>
> "One <a>Two</a> Three"
>
> Naopak, pokud upravím regexp na:
>
> "<(?P<name>\w+)>(?P<text>.*)</(?P=name)>"
>
> Tedy vynechám otazník. Výraz .* pak bere vše, co mu přijde do cesty,
> takže výsledek metody 'search' je:
>
> "One <a>Two</a> Three</a> <a>Four"
>
> Takže to také není to pravé ořechové. Rád bych to vyřešil nějak
> elegantně, nejlépe pomocí regexp (když už se je teda učím :) ), ale
> zatím jsem nenarazil na nic funkčního. Dá se podobný problém vůbec řešit
> čistě pomocí regularnich výrazů, nebo ne?
>
> Btw. k testování reg. výrazů používám prográmek
> http://kodos.sourceforge.net Rozhodně můžu doporučit.
>
http://docs.python.org/library/re.html#re-syntax
*?, +?, ??
The '*', '+', and '?' qualifiers are all greedy; they match as
much text as possible. Sometimes this behaviour isn’t desired;
if the RE <.*> is matched against '<H1>title</H1>', it will
match the entire string, and not just '<H1>'. Adding '?' after
the qualifier makes it perform the match in non-greedy or
minimal fashion; as few characters as possible will be matched.
Using .*? in the previous expression will match only '<H1>'.
> S pozdravem,
> Vlastimil S.
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
Další informace o konferenci Python