[python] Greedy regexp

Vasco vasco.vls na gmail.com
Čtvrtek Únor 25 23:12:32 CET 2010


Díky za rady.

Nesnažím se parsovat HTML, i když to tak příkladu mohlo vypadat. Původně
jsem měl v úmyslu naučit se pracovat s regexp v Pythonu a při tom jsem
narazil na tenhle zajímavý problém. O nějaké té teorii jazyků, či
gramatikách toho moc nevím.

Díky za ten pyparsing. Nejspíš si přečtu nějakou tu teorii a zkusím si
napsat jednoduchý minijazyk, když už jsem v tom učení :)

Vlastimil S.


Tomáš Drenčák wrote:
> Na parsovanie zlozitejsich veci je perfektny pyparsing. Daju sa
> definovat gramatiky a vo vnutri nich regexpy. Dokonca su tam uz aj
> predpripravane gramatiky na parsovanie beznych veci...
> 
> V Štvrtok, 25. február 2010 o 22:25 +0100, Petr Messner napísal(a):
>> Ahoj,
>>
>> především jsi nenapsal, co se snažíš vyřešit.
>>
>> Každopádně, XML nebo HTML se neparsuje regulárními výrazy (protože to prostě nejsou jazyky s regulární gramatikou, IIRC), jsou na to knihovny (BeautifulSoup, lxml atd.).
>>
>> Pokud očekáváš 
>>
>>> "One <a>Two</a> Three"
>>
>> pak bys prostě měl to jedno </a> v regulárním výraze přeskočit. Pak to ale bude bude regulární výraz specializovaný jen na elementy s jedním podelementem, což je důvod, proč na toto regulární výrazy nepoužívat.
>>
>> PM
>>
>>
>> On 25.2.2010, at 21:38, Vasco wrote:
>>
>>> 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.
>>>
>>> S pozdravem,
>>> Vlastimil S.
>>> _______________________________________________
>>> Python mailing list
>>>
>> _______________________________________________
>> Python mailing list
>> Python na py.cz
>> http://www.py.cz/mailman/listinfo/python
> 
> 
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python


Další informace o konferenci Python