¿Cómo puedo escapar del código de látex recibido a través de la entrada del usuario?

Leí una cadena de un cuadro de texto GUI ingresado por el usuario y lo procesé a través de pandoc . La cadena contiene directivas de látex para las matemáticas que tienen caracteres de barra invertida. Quiero enviar la cadena como una cadena sin procesar a pandoc para su procesamiento. Pero algo como “\ theta” se convierte en una pestaña y “heta”.

¿Cómo puedo convertir un literal de cadena que contiene caracteres de barra invertida en una cadena en bruto …?

Editar:

Gracias develerx, ovejas voladoras y unutbu. Pero ninguna de las soluciones parece ayudarme. La razón es que hay otros caracteres de barra diagonal inversa que no tienen ningún efecto en Python, pero sí tienen un significado en el látex.

Por ejemplo ‘\ lambda’. Todos los métodos sugeridos producen.

\\lambda 

lo que no pasa en el procesamiento de látex, debe permanecer como \ lambda.

Otra edición:

Si puedo conseguir este trabajo, creo que debería terminar. @Mark: Los tres métodos dan respuestas que no deseo.

 a='\nu + \lambda + \theta'; b=a.replace(r"\\",r"\\\\"); c='%r' %a; d=a.encode('string_escape'); print a u + \lambda + heta print b u + \lambda + heta print c '\nu + \\lambda + \theta' print d \nu + \\lambda + \theta 

Related of "¿Cómo puedo escapar del código de látex recibido a través de la entrada del usuario?"

Las cadenas en bruto de Python son solo una forma de decirle al intérprete de Python que debe interpretar las barras invertidas como barras literales. Si lees las cadenas introducidas por el usuario, ya están más allá del punto en que podrían haber estado sin procesar. Además, es muy probable que la entrada del usuario se lea literalmente, es decir, “en bruto”.

Esto significa que la interpretación ocurre en otro lugar. Pero si sabes que sucede, ¿por qué no escapar de las barras invertidas por lo que sea que lo interprete?

 s = s.replace("\\", "\\\\") 

(Tenga en cuenta que no puede hacer r"\" como “una cadena en bruto no puede terminar en una sola barra invertida” , pero podría haber usado r"\\" también para el segundo argumento).

Si eso no funciona, su entrada de usuario es, por algún motivo arcano, interpretar las barras invertidas, por lo que necesitará una forma de decirle que lo detenga.

Si desea convertir una cadena existente en una cadena sin formato, podemos reasignar la siguiente:

 s1 = "welcome\tto\tPython" raw_s1 = "%r"%s1 print(raw_s1) 

Imprimirá

 welcome\tto\tPython 
 a='\nu + \lambda + \theta' d=a.encode('string_escape').replace('\\\\','\\') print(d) # \nu + \lambda + \theta 

Esto muestra que hay una sola barra invertida antes de n , l y t :

 print(list(d)) # ['\\', 'n', 'u', ' ', '+', ' ', '\\', 'l', 'a', 'm', 'b', 'd', 'a', ' ', '+', ' ', '\\', 't', 'h', 'e', 't', 'a'] 

Hay algo raro con tu interfaz gráfica de usuario. Aquí hay un ejemplo simple de obtener información del usuario a través de un Tkinter.Entry . Observe que el texto recuperado solo tiene una sola barra invertida antes de n , l y t . Por lo tanto, no debería ser necesario ningún procesamiento adicional:

 import Tkinter as tk def callback(): print(list(text.get())) root = tk.Tk() root.config() b = tk.Button(root, text="get", width=10, command=callback) text=tk.StringVar() entry = tk.Entry(root,textvariable=text) b.pack(padx=5, pady=5) entry.pack(padx=5, pady=5) root.mainloop() 

Si escribe \nu + \lambda + \theta en el cuadro de Entrada, la consola imprimirá (correctamente):

 ['\\', 'n', 'u', ' ', '+', ' ', '\\', 'l', 'a', 'm', 'b', 'd', 'a', ' ', '+', ' ', '\\', 't', 'h', 'e', 't', 'a'] 

Si su GUI no está obteniendo resultados similares (como parece sugerir su publicación), entonces le recomiendo que busque solucionar el problema de la GUI, en lugar de string_escape con string_escape y replace cadenas.

Cuando lees la cadena desde el control de GUI, ya es una cadena “sin procesar”. Si imprime la cadena, es posible que vea duplicadas las barras invertidas, pero eso es un artefacto de cómo Python muestra las cadenas; Internamente todavía hay una sola barra invertida.

 >>> a='\nu + \lambda + \theta' >>> a '\nu + \\lambda + \theta' >>> len(a) 20 >>> b=r'\nu + \lambda + \theta' >>> b '\\nu + \\lambda + \\theta' >>> len(b) 22 >>> b[0] '\\' >>> print b \nu + \lambda + \theta 

Pasé mucho tiempo intentando diferentes respuestas en todo el Internet, y sospecho que las razones por las que una cosa funciona para algunas personas y no para otras se deben a diferencias extrañas muy pequeñas en la aplicación. Para el contexto, necesitaba leer los nombres de los archivos de un archivo csv que tuvieran caracteres Unicode extraños e inaceptables y escribirlos en un nuevo archivo csv. Para lo que vale, esto es lo que funcionó para mí:

 s = '\u00e7\u00a3\u0085\u00e5\u008d\u0095' # csv freaks if you try to write this s = repr(s.encode('utf-8', 'ignore'))[2:-1]