python原始字符串赋值
给定文件包含以下行:python原始字符串赋值,python,string,sqlobject,Python,String,Sqlobject,给定文件包含以下行: (?i:\bsys\.user_catalog\b) 在读取这些行时,我希望值是一个原始字符串(unscaped),这意味着在内存中,行应该是 r'(?i:\bsys\.user_catalog\b)' 而不是 (?i:\bsys\.user_catalog\b) 它在传递给libs(如sqlobject)时被转义 例如,如果我声明 Table(column=r'(?i:\bsys\.user_catalog\b)') Table(column='(?i:\bsys
(?i:\bsys\.user_catalog\b)
在读取这些行时,我希望值是一个原始字符串(unscaped),这意味着在内存中,行应该是
r'(?i:\bsys\.user_catalog\b)'
而不是
(?i:\bsys\.user_catalog\b)
它在传递给libs(如sqlobject)时被转义
例如,如果我声明
Table(column=r'(?i:\bsys\.user_catalog\b)')
Table(column='(?i:\bsys\.user_catalog\b)')
如果我声明
Table(column=r'(?i:\bsys\.user_catalog\b)')
Table(column='(?i:\bsys\.user_catalog\b)')
我没有
所以问题基本上是,当我不处于声明/赋值模式时(例如,
a=r'string'
),我可以传递一个原始字符串,而该字符串已经在内存中了。您可以在任何使用字符串的地方使用原始字符串。当您有许多转义字符时,原始字符串只是表示字符串的一种用户友好的方式
第二种情况不起作用,因为
“\”
。因此,您需要使用另一个'\'
来转义它。如果您给出”(?i:\\bsys\\.user\u catalog\\b)
,则第二种情况应该有效。在内存中,因为存储了ASCII或Unicode,所以它是否为原始字符串没有任何区别。原始字符串表示法仅在Python源代码中使用;声明为原始字符串的所有字符串都“转换”为普通字符串,并在“编译时”添加了必要的转义序列(与(Python 2中)两种不同的字符串类型string/Unicode字符串不同):
如果从文件中读取字符串,则该字符串已被正确转义 (假设
test.txt
包含(?i:\bsys\.user\u catalog\b)
):
输出:
(?i:\bsys\.user_catalog\b)
'(?i:\\bsys\\.user_catalog\\b)'
你想得不对。没有“原始字符串”类型,只有“字符串”。在引号前写入
r
,只会告诉python如何解释以下字符串
这仍然对我没有帮助,因为我需要将原始字符串传递给sqlobject。没有“原始字符串类型”这样的东西可以传递。正如M S正确指出的那样,它们是纯粹的语法糖,为程序员提供了方便。“如果您从文件中读取字符串,它已经被正确转义了。”这有点误导;更准确地说,“转义”的概念不适用于字符串对象,而仅适用于字符串文本。如果从文件中读取一个反斜杠,则会得到一个包含一个反斜杠的字符串。如果你写
“\\”
,你会得到一个有一个反斜杠的字符串。转义只发生在源代码中,因此有一种明确的方法来说明字符串的一部分是什么,以及代码的其余部分是什么。一旦字符串对象被创建,这已经很清楚了;它们是创建相同类型对象的另一种语法。@KarlKnechtel:谢谢您的澄清。我希望我可以这样写:)Python2仍然是python