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'
)的情况下传递一个原始字符串,而是这个字符串已经在内存中了。
3 个回答
2
你想的方向不太对。其实没有什么“原始字符串”这种类型,只有“字符串”。在引号前面加上r
,只是告诉Python怎么理解后面的字符串。
http://docs.python.org/reference/lexical_analysis.html#string-literals
3
你可以在任何需要字符串的地方使用原始字符串。原始字符串是一种更友好的表示方式,特别是当你有很多转义字符的时候。
第二种情况不工作的原因是因为'\'
这个符号。所以你需要用另一个'\'
来转义它。如果你写'(?i:\\bsys\\.user_catalog\\b)'
,第二种情况就可以正常工作了。在内存中,因为存储的是ASCII或Unicode,所以原始字符串和普通字符串并没有什么区别。
12
原始字符串的写法只在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)'