鉴于文件包含如下行:
(?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'
)时,我可以传递一个原始字符串,而不是字符串已经在内存中。
答案 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