2010-09-09 13 views
46

ricevo un messaggio di errore quando uso questa espressione:regex errore - niente da ripetere

re.sub(r"([^\s\w])(\s*\1)+","\\1","...") 

Ho controllato la regex a RegExr e restituisce . come previsto. Ma quando provo in Python ottengo questo messaggio di errore:

raise error, v # invalid expression 
sre_constants.error: nothing to repeat 

Qualcuno può spiegare?

+3

Se qualcuno ottiene questo errore per * nessun motivo apparente *, assicurati che la versione di Python utilizzata durante la creazione del tuo virtualenv corrisponda ancora alla versione dell'interprete installata globalmente (es. vecchio vritualenv creato prima di aggiornare Python a una versione più recente.) – hayavuk

+0

@bvukelic Come potrei regolare di nuovo in modo che fossero uguali? –

+0

Ho appena distrutto l'env esistente e lo ho ricreato. – hayavuk

risposta

32

Sembra un bug python (che funziona perfettamente in vim). L'origine del problema è il bit (\ s * ...) +. Fondamentalmente, non puoi fare (\s*)+ che abbia senso, perché stai provando a ripetere qualcosa che può essere nullo.

>>> re.compile(r"(\s*)+") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/re.py", line 180, in compile 
    return _compile(pattern, flags) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/re.py", line 233, in _compile 
    raise error, v # invalid expression 
sre_constants.error: nothing to repeat 

Tuttavia (\s*\1) non dovrebbe essere nulla, ma sappiamo che solo perché sappiamo cosa c'è in \ 1. Apparentemente Python non ... è strano.

+0

Even weirder è that '([^ \ s \ w]) (\ 1) +' * fa * funziona. –

+0

@alan: sì, l'ho notato anche io. – mb14

+0

se questo è il caso, c'è una soluzione? – goh

9

Questo è un bug Python tra "*" e caratteri speciali.

Invece di

re.compile(r"\w*") 

Prova:

re.compile(r"[a-zA-Z0-9]*") 

Funziona, ma non fa la stessa espressione regolare.

Questo errore sembra essere stato risolto tra 2.7.5 e 2.7.6.

2

Non è solo un bug Python con * in realtà, può anche accadere quando si passa una stringa come parte della propria espressione regolare per essere compilata, come;

import re 
input_line = "string from any input source" 
processed_line= "text to be edited with {}".format(input_line) 
target = "text to be searched" 
re.search(processed_line, target) 

questo causerà un errore se la linea elaborata conteneva alcuni "(+)", per esempio, come si può trovare in formule chimiche, o tali catene di caratteri. la soluzione è di fuggire ma quando lo fai al volo, può succedere che non riesci a farlo correttamente ...

0

Oltre il bug che è stato scoperto e risolto, mi limiterò a notare che il messaggio di errore sre_constants.error: nothing to repeat è un po 'confuso. Stavo cercando di usare r'?.*' come schema, e ho pensato che si lamentava per qualche strana ragione riguardo allo *, ma il problema è in realtà che ? è un modo per dire "ripetere zero o una volta". Quindi dovevo dire un valore letterale ?

Problemi correlati