python3 - Escapar de la cadena de expresiones regulares en Python
expresiones regulares python pdf (4)
Quiero utilizar la entrada de un usuario como un patrón de expresiones regulares para buscar 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 quiere buscar Word (s)
: el motor regex tomará el (s)
grupo (s)
. Quiero que lo trate como una cadena "(s)"
. Puedo ejecutar replace
en la entrada del usuario y reemplazar el (
con /(
y the )
con /)
pero el problema es que tendré que reemplazarlo por cada posible símbolo de expresión regular. ¿Conoces alguna forma mejor?
Desafortunadamente, re.escape()
no es adecuado para la cadena de reemplazo:
>>> re.sub(''a'', re.escape(''_''), ''aa'')
''//_//_''
Una solución es poner el reemplazo en una lambda:
>>> re.sub(''a'', lambda _: ''_'', ''aa'')
''__''
porque el valor de retorno de la lambda es tratado por re.sub()
como una cadena literal.
Por favor, prueba:
/ Q y / E como anclajes
Ponga una condición O para hacer coincidir una palabra completa o una expresión regular.
Ref Link: Cómo hacer coincidir una palabra completa que incluye caracteres especiales en expresiones regulares
Puedes usar re.escape () :
re.escape (string) Retorno de cadena con todos los caracteres no alfanuméricos retrocedidos; 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//.//*//$''
Use la función re.escape()
para esto:
4.2.3 re
Contenidos del módulo
escape (cadena)
Cadena de retorno con todos los caracteres no alfanuméricos retroceden; esto es útil si desea hacer coincidir una cadena literal arbitraria que puede tener metacaracteres de expresiones regulares en ella.
Un ejemplo simplista, busca cualquier ocurrencia de la cadena provista, seguida opcionalmente de ''s'', y devuelve el objeto de coincidencia.
def simplistic_plural(word, text):
word_or_plural = re.escape(word) + ''s?''
return re.match(word_or_plural, text)