如何转义用户输入的LaTeX代码?
我从一个图形用户界面的文本框里读取了用户输入的字符串,然后通过pandoc来处理这个字符串。这个字符串里包含了数学用的latex指令,其中有反斜杠字符。我想把这个字符串作为原始字符串发送给pandoc进行处理。但是像"\theta"这样的内容却变成了一个制表符和"heta"。
我该如何把包含反斜杠字符的字符串字面量转换成原始字符串呢……?
编辑:
谢谢develerx、flying sheep和unutbu。但是没有一个解决方案对我有帮助。原因是还有其他带反斜杠的字符在python中没有任何效果,但在latex中却有特定的含义。
比如说'\lambda'。所有建议的方法都产生了
\\lambda
这在latex处理时无法通过——它应该保持为\lambda。
另一个编辑:
如果我能让这个工作正常,我想我就能解决问题了。@Mark:这三种方法都给出了我不想要的结果。
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
5 个回答
a='\nu + \lambda + \theta'
d=a.encode('string_escape').replace('\\\\','\\')
print(d)
# \nu + \lambda + \theta
这段话说明在 n
、l
和 t
前面只有一个反斜杠。
print(list(d))
# ['\\', 'n', 'u', ' ', '+', ' ', '\\', 'l', 'a', 'm', 'b', 'd', 'a', ' ', '+', ' ', '\\', 't', 'h', 'e', 't', 'a']
你的图形界面(GUI)有点问题。这里有个简单的例子,展示如何通过 Tkinter.Entry
获取用户输入。注意,获取到的文本在 n
、l
和 t
前面只有一个反斜杠。所以不需要额外的处理:
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()
如果你在输入框里输入 \nu + \lambda + \theta
,控制台会(正确地)打印出:
['\\', 'n', 'u', ' ', '+', ' ', '\\', 'l', 'a', 'm', 'b', 'd', 'a', ' ', '+', ' ', '\\', 't', 'h', 'e', 't', 'a']
如果你的图形界面没有返回类似的结果(就像你帖子里提到的那样),那么我建议你先去解决图形界面的问题,而不是去搞 string_escape
和字符串 replace
。
如果你想把一个已经存在的字符串转换成原始字符串,可以像下面这样重新赋值。
s1 = "welcome\tto\tPython"
raw_s1 = "%r"%s1
print(raw_s1)
这段代码会输出:
welcome\tto\tPython
Python中的原始字符串是一种告诉Python解释器要把反斜杠当作普通的斜杠来处理的方法。如果你读取用户输入的字符串,它们已经过了可以被当作原始字符串的阶段。而且,用户输入通常是以字面意思读取的,也就是“原始”的。
这意味着解释的过程发生在其他地方。但是如果你知道这个过程会发生,为什么不在解释之前把反斜杠处理一下呢?
s = s.replace("\\", "\\\\")
(注意,你不能写 r"\"
,因为“原始字符串不能以单个反斜杠结尾”,不过我也可以用 r"\\"
作为第二个参数。)
如果这样做还是不行,那可能是用户输入在某种神秘的情况下正在解释反斜杠,所以你需要找到一种方法来告诉它停止这种处理。