2011-11-24 124 views
3

給定文件所包含的行如:Python原始字符串賦值

(?i:\bsys\.user_catalog\b) 

在閱讀這些線,我希望值是原始的字符串(轉義),這意味着,在內存中,行應該是

r'(?i:\bsys\.user_catalog\b)' 

代替

(?i:\bsys\.user_catalog\b) 

當傳遞到庫如的SQLObject這是逃脫。

例如,對於SQLObject的,如果我的狀態

Table(column=r'(?i:\bsys\.user_catalog\b)') 

我得到想要的結果,而如果我說出

Table(column='(?i:\bsys\.user_catalog\b)') 

我不知道。

所以問題是基本上,我可以傳遞一個原始字符串,當我不處於聲明/分配模式(例如a = r'string'),而是字符串已經在內存中。

回答

6

原始字符串表示法僅用於Python源代碼;聲明爲原始字符串的所有字符串是「轉換」,以與在「編譯時間」添加了必要的轉義序列正常串(不同於(在Python 2)的兩個不同的串類型的串/ Unicode字符串):

>>> r"\b" 
'\\b' 
>>> "Hello" 
'Hello' 
>>> u"Hello" 
u'Hello' 

如果你從文件中讀取字符串,它已經被正確地轉義了。

(假設test.txt包含(?i:\bsys\.user_catalog\b)):

f = open("test.txt").read() 
print f 
print repr(f) 

輸出:

(?i:\bsys\.user_catalog\b) 
'(?i:\\bsys\\.user_catalog\\b)' 
+4

「如果您從文件中讀取字符串,它將已正確轉義。」這有點讓人誤解。更準確地說,「轉義」的概念不適用於字符串**對象**,而僅適用於字符串**文字**。如果從文件中讀取一個反斜槓,則會得到一個帶有一個反斜槓的字符串。如果你寫'「\\」',你會得到一個帶有一個反斜槓的字符串。轉義只發生在源代碼中,這樣就可以清楚地說出字符串的部分內容以及代碼的其餘部分。一旦字符串對象被創建,這已經很清楚了。 –

+0

同樣,原始字符串不會「轉換」;他們是*替代語法*用於創建*相同類型的對象*。 –

+0

@KarlKnechtel:謝謝你的澄清。我希望我可以像這樣寫:) –

2

您可以在任何使用字符串的地方使用原始字符串。當您有很多轉義字符時,原始字符串只是一種用戶友好的方式來表示字符串。

第二種情況不適用於'\'。所以你需要使用另一個'\'來轉義它。如果您提供'(?i:\\bsys\\.user_catalog\\b)',則第二種情況應該起作用。在內存中,由於存儲了ascii或unicode,因此如果它是原始字符串,它就會有任何不同。

+0

這仍然不能幫助我,因爲我需要將原始字符串的SQLObject –

+1

沒有所謂的「原始字符串類型」沒有這樣的事,你可以通過。正如M正確指出的那樣,它們是程序員方便的純語法糖。 –