2011-08-31 284 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

相關問題