[python] Problem s regularnym vyrazom

Petr Prikryl PrikrylP na skil.cz
Pátek Únor 2 14:42:21 CET 2007


> Petr Prikryl wrote:
> > RMiklos na ...sk
> >> [...]'''CREATE TABLE IBPDDB071/R004660V
> >> (PERSONNR    DECIMAL     (10, 0)    NOT NULL WITH DEFAULT, 
> >> LFDNR1 DECIMAL (3, 0) [...] );'''
> >
> > No jasně. Když jsou vevnitř závorky, tak to nemůže
> > fungovat. Problém je principiální. Regulární výrazy
> > obecně nemohou popisovat řetězce jazyků, které obsahují
> > párové struktury. Možná se dají zpracovat nějaké speciální
> > případy na základě dalších znalostí.
> >   
> Presne tak. V tomhle pripade jsem si pohraval s myslenkou, 
> ktera by se dala zapsat matematicky asi takhle (pouze 
> pro retezec v zavorkach):
> 
>     A = {a-zA-Z0-9_, }
>     B = {0-9, }
>     C = (B*)
>     L = (A*+C*)
> 
> Bohuzel, kdyz na to ted koukam, tak jazyk L neni regularni. 
> Presto si ale myslim, ze tento jazyk lze popsat gramatikou 
> popr. automatem. Jestli se pletu, opravte me prosim.

No, mělo by to jít, protože tady jde o speciální případ.
Jednak se používá nástroj pro "regulární výrazy s rozšířením".
Při jeho překladu se buduje konečný automat (odhad), který
má navíc jakoby globální proměnné (hodnoty skupin). 
Můžu předepsat non-greedy vyhodnocování. Zkoumaný
řetězec navíc neobsahuje libovolně zanořené párové struktury,
ale pouze dvě úrovně. Automat se tedy nemusí rozšiřovat až
na obecnější, zásobníkový. Stačí ho trochu rozepsat a 
úroveň zanoření vyjádřit přechodem do jiné části automatu.
Měl by tedy jít napsat i regulární výraz.

pepr

P.S. Nechce se mi do toho ;-)


Další informace o konferenci Python