2012-09-12 10 views
7

Tengo un problema con una expresión regular de Python aparentemente simple.¿Qué es sre_constants.error: nada que repetir

# e.g. If I wanted to find "mark has wonderful kittens, but they're mischievous.." 
p = re.compile("*kittens*") 

Este fallará con el error:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib64/python2.7/re.py", line 190, in compile 
    return _compile(pattern, flags) 
    File "/usr/lib64/python2.7/re.py", line 242, in _compile 
    raise error, v # invalid expression 
sre_constants.error: nothing to repeat 

probablemente estoy perdiendo algo muy simple, las expresiones regulares no son ciertamente en mis puntos fuertes!

Respuesta

18

Estás confundiendo expresiones regulares con globs.

decir:

p = re.compile(".*kittens.*") 

Tenga en cuenta que un asterisco desnuda no significa lo mismo en un RE como lo hace en una expresión pegote.

+0

Gracias. Esto parece funcionar perfectamente. Por cierto, ¿hay alguna guía para aprender RE que usted (o cualquier otra persona) recomendaría? La documentación de Python es genial y todo, pero parece un poco empinada. –

+1

@RickyHewitt Pruebe http://www.regular-expressions.info/tutorial.html. – unwind

2

* es un metacarácter, que significa "0 o más del token anterior", y no hay nada que repetir para el primer *.

Tal vez usted está buscando los límites de palabra:

p = re.compile(r"\bkittens\b") 

\b asegura que sólo palabras completas se corresponden (por lo que esta expresión regular fallaría en, ejem, "kittenshit")

+1

esto no quedará atrapado en un 're.match', pero se verá atrapado en' re.findall' o 're.search' (+1). – mgilson

+2

Si golpea gatitos, usted y yo vamos a tener palabras, señor, 75k + karma o no. – DSM

Cuestiones relacionadas