python原始字符串赋值

Tzu*_*hay 4 python string sqlobject

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

(?i:\bsys\.user_catalog\b)
Run Code Online (Sandbox Code Playgroud)

在读取这些行时,我希望该值是一个原始字符串(未转义),这意味着,在内存中,行应该是

r'(?i:\bsys\.user_catalog\b)'
Run Code Online (Sandbox Code Playgroud)

代替

(?i:\bsys\.user_catalog\b)
Run Code Online (Sandbox Code Playgroud)

当传递给诸如sqlobject之类的lib时,它会被转义.

例如,使用sqlobject,如果我声明

Table(column=r'(?i:\bsys\.user_catalog\b)')
Run Code Online (Sandbox Code Playgroud)

如果我说的话,我会得到理想的结果

Table(column='(?i:\bsys\.user_catalog\b)')
Run Code Online (Sandbox Code Playgroud)

我不.

所以问题基本上是,当我不处于声明/赋值模式(例如a = r'string')时,我可以传递原始字符串,而不是字符串已经在内存中.

Tim*_*ker 6

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

>>> r"\b"
'\\b'
>>> "Hello"
'Hello' 
>>> u"Hello"
u'Hello'
Run Code Online (Sandbox Code Playgroud)

如果您从文件中读取字符串,则它已经被正确转义.

(假设test.txt包含(?i:\bsys\.user_catalog\b)):

f = open("test.txt").read()
print f
print repr(f)
Run Code Online (Sandbox Code Playgroud)

输出:

(?i:\bsys\.user_catalog\b)
'(?i:\\bsys\\.user_catalog\\b)'
Run Code Online (Sandbox Code Playgroud)

  • "如果你从文件中读取字符串,它就会被正确转义." 这有点误导; 更准确地说,"转义"的概念不适用于字符串**对象**,而只适用于字符串**literal**.如果从文件中读取一个反斜杠,则会得到一个带有一个反斜杠的字符串.如果你写'"\\"`,你会得到一个带有一个反斜杠的字符串.转义只发生在源代码中,因此有一个明确的方式来说明字符串的一部分以及其余代码的一部分.一旦创建了字符串对象,那就已经很清楚了. (6认同)