2008-11-11 35 views
155

Quiero utilizar la entrada de un usuario como un patrón de expresiones regulares para una búsqueda sobre algún texto. Funciona, pero ¿cómo puedo manejar los casos en los que el usuario pone caracteres que tienen significado en expresiones regulares? Por ejemplo, el usuario desea buscar Word (s): el motor regex tomará el (s) como un grupo. Quiero que lo trate como una cadena "(s)". Puedo ejecutar replace en la entrada del usuario y reemplazar el ( con \( y el ) con , pero el problema es que tendré que reemplazar por cada posible símbolo de expresión regular. ¿Conoces alguna mejor manera?Escapar cadena de expresiones regulares en Python

Respuesta

209

utilizar la función re.escape() para esto:

4.2.3 re Module Contents

de escape (cadena)

cadena devuelta con todos los no-alfanuméricos barra invertida; esto es útil si desea hacer coincidir una cadena literal arbitraria que puede tener metacaracteres de expresiones regulares en ella.

Un ejemplo simplista, busque cualquier aparición de la cadena provista, seguida opcionalmente de 's', y devuelva el objeto de coincidencia.

def simplistic_plural(word, text): 
    word_or_plural = re.escape(word) + 's?' 
    return re.match(word_or_plural, text) 
39

Puede utilizar re.escape():

re.escape (cadena) cadena devuelta con todos los no-alfanuméricos barra invertida; esto es útil si desea hacer coincidir una cadena literal arbitraria que puede tener metacaracteres de expresiones regulares en ella.

>>> import re 
>>> re.escape('^a.*$') 
'\\^a\\.\\*\\$' 
0

Desafortunadamente, re.escape() no es adecuado para la cadena de reemplazo:

>>> re.sub('a', re.escape('_'), 'aa') 
'\\_\\_' 

Una solución es poner la sustitución en un lambda:

>>> re.sub('a', lambda _: '_', 'aa') 
'__' 

debido a que el valor de retorno de el lambda es tratado por re.sub() como una cadena literal.

+1

El argumento '' repl' a re.sub' es una cadena, no una expresión regular; aplicar 're.escape' a esto no tiene ningún sentido en primer lugar. – tripleee

Cuestiones relacionadas