Expresión regular para reemplazar los caracteres “escapados” con sus originales.

NOTA: No estoy analizando muchos html o html o generics con regex. Se que eso es malo

TL; DR :

Tengo cuerdas como

A sentence with an exclamation\! Next is a \* character 

Donde hay caracteres “escapados” en el marcado original. Deseo reemplazarlos por sus “originales”. Y obten:

 A sentence with an exclamation! Next is a * character 

Tengo una pequeña cantidad de datos que necesito extraer de algún marcado de wiki.

Aquí solo me ocupo de los párrafos / fragmentos, por lo que no necesito una gran solución robusta. En python, probé una prueba:

 s = "test \\* \\! test * !! **" r = re.compile("""\\.""") # Slash followed by anything r.sub("-", s) 

Esto DEBERÍA ser:

 test - - test * !! ** 

Pero no hace nada. ¿Me estoy perdiendo de algo?

Además, no estoy seguro de cómo reemplazar un personaje escapado dado con su original, por lo que probablemente haría una lista y sub con expresiones regulares específicas como:

 \\\* 

y

 \\! 

Probablemente haya una forma mucho más limpia de hacer esto, por lo que cualquier ayuda es muy apreciada.

Te falta algo, es decir, el prefijo r :

 r = re.compile(r"\\.") # Slash followed by anything 

Tanto python como re adjuntan significado a \ ; su doble barra invertida se convierte en una sola barra invertida cuando pasa el valor de la cadena a re.compile() , momento en el que re ver \. , lo que significa un punto final literal:

 >>> print """\\.""" \. 

Al usar r'' le dices a Python que no interprete los códigos de escape, por lo que ahora se le asigna una cadena con \\. , es decir, una barra invertida literal seguida de cualquier carácter:

 >>> print r"""\\.""" \\. 

Manifestación:

 >>> import re >>> s = "test \\* \\! test * !! **" >>> r = re.compile(r"\\.") # Slash followed by anything >>> r.sub("-", s) 'test - - test * !! **' 

La regla de oro es: cuando defina expresiones regulares, use r'' literales de cadena sin formato, lo que le ahorrará tener que escapar dos veces todo lo que tenga significado tanto para la syntax de Python como para la expresión regular.

A continuación, desea reemplazar el carácter ‘escapado’; use grupos para eso, re.sub() permite hacer referencia a grupos como el valor de reemplazo:

 r = re.compile(r"\\(.)") # Note the parethesis, that's a capturing group r.sub(r'\1', s) # \1 means: replace with value of first capturing group 

Ahora la salida es:

 >>> r = re.compile(r"\\(.)") # Note the parethesis, that's a capturing group >>> r.sub(r'\1', s) 'test * ! test * !! **'