2011-08-31 159 views
35

我从用户输入的GUI文本框中读取字符串,并通过pandoc进行处理。该字符串包含用于数学的乳胶指令,该指令具有反斜杠字符。我想将字符串作为原始字符串发送给pandoc进行处理。但是像'\ theta'这样的东西就成了一个标签和'heta'。python:如何将字符串文字转换为原始字符串文字?

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

编辑:

谢谢develerx,飞羊和unutbu。但没有任何解决方案似乎对我有帮助。原因是还有其他反斜杠字符,它们在蟒蛇中没有任何影响,但对乳胶有意义。

例如'\ 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 
+0

你确定字串的确不包含'\\ lambda'并不仅仅是增加了一倍,当你打印出来?尝试打印'mystring [1:]',看看里面是否还有'\'。应该有一些一致性 - 如果'\ t'正在转换为标签,那么'\\'应该转换为'\'。 –

+0

您可以发布从GUI文本框收到的字符串的'repr',并显示您用于通过pandoc处理它的代码吗? – unutbu

+0

你的测试是不现实的。你没有从文本框中获得它,你用一个字符串字面值来设置它,并且Python在分配给'a'时已经以不一致的方式转换它。在这一点上不可能获得原始文本。 –

回答

37

Python的原始字符串只是一种告诉Python解释器它应该将反斜杠解释为文字斜杠的方法。如果你阅读用户输入的字符串,他们已经超过了他们可能已经生的点。而且,用户输入最有可能被逐字读出,即“原始”。

这意味着解释发生在别的地方。但是如果你知道它发生了,为什么不逃避反斜线来解释它?

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

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

如果不工作,你的用户输入是对于一些解释反斜杠的神秘原因,所以你需要一种方式来告诉它停止。

+0

这是我第一次看到“原始字符串不能以单个反斜杠结尾”。我还没有意识到Python字符串解析是如此的hacky - 我认为'r'前缀意味着停止将反斜杠视为特殊的东西,而是意味着输出两个字符而不是解释它们。 –

+0

@MarkRansom是的,F字符串也只是字符串后处理,而不是一个实际的子分析器... –

4
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之前只有一个反斜杠。如果您键入\nu + \lambda + \theta进输入框,控制台会(正确地)打印

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

:因此,没有额外的处理应该是必要的

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

如果你的GUI没有返回类似的结果(如您帖子似乎建议),然后我建议寻找修复GUI问题,而不是与string_escape和字符串replace四处寻找。

+0

这是很好,如果它是解释字符串的Python。如果它是pandoc,它可能不起作用。你知道什么(除了反斜杠)还有'string_escape'吗?也许它确实太多了? –

+0

@flying sheep:文档说'string_escape' [“产生一个适合Python源代码中字符串字符串的字符串。”](http://docs.python.org/library/codecs.html)。 AFAIK,'string_escape'影响反斜杠或反斜杠的字符,没有别的。也许我错了。如果它能做得更多,我们很乐意学习。 – unutbu

+0

我不知道比你更多。很可能你是对的。但是再次说明:如果解释发生的点吃掉了一些转义符(如'\ s'→''),那么这将产生无声错误。他应该找到来源。 –

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 
0
import re 

matches = [] 
var = 'Hello, how are you?' 

search_term = 'how are' 


if re.search('\\b'+search_term+'\\b', var): 
    matches.append(search_term) 
    print matches 

else: 
    print 'false' 
6

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

s1 = "welcome\tto\tPython"

raw_s1 = "%r"%s1

print(raw_s1)

将打印

welcome\tto\tPython

+1

我相信,至少在Python3中,这实际上会打印出:'welcome \\ tto \\ tPython' - 包括单引号。 – disflux

+0

@disflux我刚用Python 3.3.6进行了测试,并打印出来:'>>> >>> s1 =“welcome \ tto \ tPython” >>> raw_s1 =“%r”%s1 >>> print(raw_s1) 'welcome \ tto \ tPython''' – user

相关问题