2010-09-09 12 views
46

me sale un mensaje de error cuando se utiliza esta expresión:error de expresiones regulares - nada para repetir

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

comprobado que la expresión regular en RegExr y vuelve . como se esperaba. Pero cuando lo intento en Python obtengo este mensaje de error:

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

¿Puede alguien explicar?

+3

Si alguien obtiene este error * sin motivo aparente *, asegúrese de que la versión de Python utilizada al crear su virtualenv coincida con la versión del intérprete instalado globalmente (por ejemplo, viejo vritualenv creado antes de actualizar Python a una versión más reciente.) – hayavuk

+0

@bvukelic ¿Cómo me reajustaría para que sean iguales? –

+0

Acabo de destruir el entorno existente y lo recreé. – hayavuk

Respuesta

32

Parece ser un error de pitón (que funciona perfectamente en vim). El origen del problema es el bit (\ s * ...) +. Básicamente, no puede hacer (\s*)+ que tengan sentido, porque está intentando repetir algo que puede ser nulo.

>>> 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 

Sin embargo (\s*\1) no debería ser nula, pero sabemos que sólo porque sabemos lo que está en \ 1. Aparentemente Python no ... es extraño.

+0

Aún más extraño es que '([^ \ s \ w]) (\ 1) +' * does * work. –

+0

@alan: sí, también lo he notado. – mb14

+0

si ese es el caso, ¿hay alguna solución? – goh

9

Ese es un error de Python entre "*" y caracteres especiales.

En lugar de

re.compile(r"\w*") 

Probar:

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

Funciona, sin embargo, no hace que la misma expresión regular.

Parece que este error se ha corregido entre 2.7.5 y 2.7.6.

2

No es solo un error de Python con * en realidad, también puede suceder cuando pasa una cadena como parte de su expresión regular para compilarse, como;

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) 

esto causará un error si la línea procesada contenía algunos "(+)", por ejemplo, como se puede encontrar en las fórmulas químicas, o tales cadenas de caracteres. la solución es escapar, pero cuando lo haces sobre la marcha, puede suceder que no lo hagas correctamente ...

0

Más allá del error que se descubrió y solucionó, me limitaré a señalar que el mensaje de error sre_constants.error: nothing to repeat es un poco confuso. Estaba tratando de usar r'?.*' como un patrón, y pensé que se quejaba por alguna extraña razón sobre el *, pero el problema es que ? es una forma de decir "repetir cero o una vez". Así que necesitaba decir r'\?.*' para que coincida con un literal ?

Cuestiones relacionadas