6

给定一个文件包含以下行:

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

4

3 回答 3

8

原始字符串表示法仅在 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)'
于 2011-11-24T08:52:25.397 回答
2

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

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

于 2011-11-24T08:48:21.953 回答
1

你正在以错误的方式思考这个问题。没有“原始字符串”类型,只有“字符串”。写r在引号前面只告诉python如何解释下面的字符串。

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

于 2011-11-24T08:59:29.680 回答