[Python] regex killer

Giovanni Porcari giovanni.porcari a softwell.it
Mer 16 Ott 2013 13:48:07 CEST


Il giorno 16/ott/2013, alle ore 13:45, Daniele Varrazzo <piro a develer.com> ha scritto:

> On 2013-10-16 12:34, Giovanni Porcari wrote:
>> Il giorno 16/ott/2013, alle ore 13:27, Marco Giusti
>> <marco.giusti a gmail.com> ha scritto:
>> 
>>> On Wed, Oct 16, 2013 at 01:09:26PM +0200, Giovanni Porcari wrote:
>>>> Buongiorno a tutti
>>>> 
>>>> 
>>>> Eseguendo questo codice in python 2.7.5 funziona correttamente
>>>> ma in 2.7.2. e 2.7.3 python si impianta e non termina.
>>>> 
>>>> Succede solo a me ?
>>> 
>>> Che si pianti mi sembra normale. Ecco una letturina per la sera[1]
>>> oppure il libro di Beri sulle regex.
>>> 
>>> In pratica questa parte "(?P<nome>(?:\w*?\s*?)*?\w*)" ha un tempo di
>>> eseguzione che è quadratico. Piuttosto mi stupische che la 2.7.5
>>> funzioni, è cambiato qualcosa nell'implementazione?
>>> 
>>> [1] http://swtch.com/~rsc/regexp/regexp1.html
>>> 
>>> ciao
>>> 
>>>> import re
>>>> 
>>>> t="CURRICULUM Rossi Mazzanti Vien Dal Mare Mario DF/433/43"
>>>> r=r"^(?:CURRICULUM\s*)(?P<nome>(?:\w*?\s*?)*?\w*)\s*?(?P<codice>\w{2}/\w{3}/\w{2})\s*$"
>>>> R=re.compile(r)
>>>> a=re.search(R,t)
>>>> print a.groups()
>> 
>> 
>> Capisco che sia quadratico e mi sta bene ma parliamo di applicare la
>> regex su una stringa di 55 caratteri.
> 
> Infatti, penso sia http://bugs.python.org/issue9669
> 
> v2.7.4                         83117:026ee0057e2d
> 
> changeset:   82226:dc8a11c16021
> branch:      2.7
> parent:      82219:c1b3d25882ca
> user:        Serhiy Storchaka <storchaka a gmail.com>
> date:        Sat Feb 16 21:23:01 2013 +0200
> summary:     Issue #9669: Protect re against infinite loops on zero-width matching in
> 
> v2.7.3                         76200:70274d53c1dd
> 
> Direi rilasciato in 2.7.4.
> 
> 
> -- 
> Daniele Varrazzo - Develer S.r.l.
> http://www.develer.com
> 


Grazie Daniele. Anche tu sei una roccia ;).

Avevo cercato sul bugtrack ma evidentemente non sono molto abile in queste ricerche ;)


Grazie !

G



Maggiori informazioni sulla lista Python