2011-11-24 90 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正确指出的那样,它们是程序员方便的纯语法糖。 –