python原始字符串赋值

时间:2011-11-24 08:45:03

标签: python string sqlobject

鉴于文件包含如下行:

(?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')时,我可以传递一个原始字符串,而不是字符串已经在内存中。

3 个答案:

答案 0 :(得分:6)

原始字符串表示法仅用于Python源代码;声明为原始字符串的所有字符串都被转换为"在"编译时间"期间添加必要的转义序列到普通字符串(不同于(在Python 2中)两种不同的字符串类型string / Unicode string):

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

答案 1 :(得分:2)

您可以在使用字符串的任何地方使用原始字符串。当你有很多转义字符时,原始字符串只是一种用户友好的方式来表示字符串。

由于'\',第二种情况无效。所以你需要使用另一个'\'来逃避它。如果你给'(?i:\\bsys\\.user_catalog\\b)',第二种情况应该有效。在内存中,由于存储了ASCII或Unicode,如果它是原始字符串,则没有任何区别。

答案 2 :(得分:1)

你正在考虑这个错误的方法。没有"原始字符串" type,only" string"。在引号前面写r只会告诉python如何解释以下字符串。

http://docs.python.org/reference/lexical_analysis.html#string-literals