如何通过用户输入转义收到的乳胶代码?

时间:2011-08-31 20:12:30

标签: python string text

我从用户输入的GUI文本框中读取一个字符串,并通过pandoc处理它。该字符串包含带有反斜杠字符的math的latex指令。我想将字符串作为原始字符串发送到pandoc进行处理。但是像“\ theta”这样的东西变成了一个标签和“heta”。

如何将包含反斜杠字符的字符串文字转换为原始字符串...?

编辑:

谢谢develerx,飞羊和unutbu。但是这些解决方案似乎都没有帮助我。原因是还有其他的backslashed-characters在python中没有任何影响但在latex中有意义。

例如'\ lambda'。所有建议的方法都产生

\\lambda

在胶乳处理中没有经过 - 它应该保持为\ 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 个答案:

答案 0 :(得分:41)

Python的原始字符串只是一种告诉Python解释器它应该将反斜杠解释为文字斜杠的方法。如果您阅读了用户输入的字符串,那么它们已经超出了原始状态。此外,用户输入最有可能按字面读取,即“原始”。

这意味着口译发生在其他地方。但是,如果你知道它发生了,为什么不逃避反斜杠的任何解释呢?

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

(请注意,您不能r"\"作为“a raw string cannot end in a single backslash”,但我也可以使用r"\\"作为第二个参数。)

如果这不起作用,那么您的用户输入是出于解释反斜杠的一些神秘原因,因此您需要一种方法来告诉它停止反射。

答案 1 :(得分:15)

如果您想将现有字符串转换为原始字符串,那么我们可以重新分配,如下所示

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

将打印

welcome\tto\tPython

答案 2 :(得分:5)

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

这表明在nlt之前只有一个反斜杠:

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

您的GUI有一些时髦的东西。这是一个通过Tkinter.Entry获取一些用户输入的简单示例。请注意,检索到的文本在nlt之前只有一个反斜杠。因此,不需要额外的处理:

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']

如果您的GUI没有返回类似的结果(正如您的帖子似乎建议的那样),那么我建议您考虑修复GUI问题,而不是使用string_escape和字符串replace

答案 3 :(得分:3)

当您从GUI控件读取字符串时,它已经是一个“原始”字符串。如果您打印出字符串,您可能会看到反斜杠加倍,但这是Python显示字符串的工件;内部仍然只有一个反斜杠。

>>> 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

答案 4 :(得分:2)

我花了很多时间在整个互联网上尝试不同的答案,我怀疑为什么一件事对某些人有用而对其他人不起作用的原因是由于应用程序中很小的怪异差异。对于上下文,我需要从具有奇怪和/或不可映射的unicode字符的csv文件中读取文件名,并将它们写入新的csv文件。对于它而言,这对我有用:

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