2011-05-03 22 views
9

He descubierto algo que no puedo explicar en el módulo de Python. Compilación de (a*)* o (a*|b)* genera un error:comportamiento extraño de Python Regex

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

He probado con esta expresión regular en javascript y parece estar bien.

¿Es un error?

+2

Relacionados: http://stackoverflow.com/questions/3675144/regex-error-nothing-to-repeat – Kobi

+0

¿Cuál es su versión de python? – lzap

+1

Yo agregaría: lógicamente, ninguno de estos tiene sentido. '(a *) *' es lo mismo que 'a *', y '(a * | b) *' es lo mismo que '[ab] *' (o '(a | b) *'). ¿Hay un buen caso de uso, por curiosidad? – Kobi

Respuesta

9

Sí, es un error (o al menos un error). Se queja de que si a* no coincide con nada, no sabe cómo capturar 0 o más "nada".

5

a* puede ser nulo, dando (null)* que no tiene sentido para el intérprete. (a*|b) también puede ser nulo, ya que puede evaluar a cualquiera (b) o (a*) .you podríamos utilizar (a+)* y por lo tanto (a+|b)*

+0

Estoy totalmente de acuerdo contigo, pero de todos modos Mu Mind tiene razón. – f0b0s

+0

@ f0b0s Esencialmente, @Mu y yo estamos diciendo lo mismo, la única diferencia es cuán explícitamente, es por eso que lo voté por ganar primero. – theheadofabroom

+0

Gracias por su explicación. – f0b0s

1

En realidad, hay una razón importante para que Python rechace (a*)* y (a*|b)*. Como * es codicioso, coincide con la cadena más larga que puede. El problema es que si la expresión regular modificada por * está vacía, entonces el analizador de expresiones regulares intenta hacer coincidir tantas repeticiones de cadenas vacías como sea posible. Esto significa que coincidiría con cualquier cantidad de cadenas vacías entre dos caracteres de la cadena con la que realice la prueba. Como el a* está en un grupo de captura, debería capturar todas esas cadenas vacías, lo que sería imposible.