Python原始字符串赋值

9 投票
3 回答
23041 浏览
提问于 2025-04-17 06:58

假设有一个文件,里面的内容是这样的:

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

撰写回答