在问这个问题时,我意识到我对原始字符串了解不多。对于自称是 Django 培训师的人来说,这很糟糕。
我知道什么是编码,而且我知道u''
单独做什么,因为我知道什么是 Unicode。
但究竟有什么作用r''
呢?它产生什么样的字符串?
最重要的是,这到底是ur''
做什么的?
最后,是否有任何可靠的方法可以从 Unicode 字符串返回到简单的原始字符串?
啊,顺便说一句,如果你的系统和文本编辑器字符集设置为 UTF-8,u''
实际上有什么作用吗?
没有真正的“原始字符串”;有原始字符串文字,它们正是'r'
在开始引号之前标记的字符串文字。
“原始字符串文字”与字符串文字的语法略有不同,其中反斜杠 ,\
被视为“只是一个反斜杠”(除非它正好出现在引号之前,否则会终止文字)——没有“转义序列”代表换行符、制表符、退格符、换页符等。在正常的字符串文字中,每个反斜杠都必须加倍以避免被视为转义序列的开始。
这种语法变体的存在主要是因为正则表达式模式的语法带有大量反斜杠(但从来没有放在最后,所以上面的“except”子句无关紧要)并且当你避免将它们中的每一个都加倍时看起来会好一些 - - 就这样。表达本机 Windows 文件路径(使用反斜杠而不是其他平台上的常规斜杠)也很受欢迎,但这很少需要(因为正常的斜杠在 Windows 上也能正常工作)并且不完美(由于“except”子句)以上)。
r'...'
是一个字节字符串(在 Python 2.* 中),ur'...'
是一个 Unicode 字符串(同样在 Python 2.* 中),并且其他三种引用中的任何一种也产生完全相同类型的字符串(例如r'...'
, r'''...'''
, r"..."
,r"""..."""
都是字节串,等等)。
不确定你所说的“返回”是什么意思- 本质上没有前后方向,因为没有原始字符串类型,它只是表达完全正常的字符串对象、字节或 unicode 的替代语法,因为它们可能是。
是的,在Python 2 *,u'...'
是当然总是从刚不同'...'
-前者是一个unicode字符串,后者是一个字节的字符串。文字可以用什么编码表示是一个完全正交的问题。
例如,考虑(Python 2.6):
>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34
Unicode 对象当然需要更多的内存空间(对于很短的字符串来说差别很小,显然;-)。
理解“r”并不意味着任何类型或编码问题,它要简单得多。
请注意 ru"C:\foo\unstable" 将失败,因为 \u 是 ru 模式下的 unicode 转义序列。r 模式没有 \u。
请注意,
u
andr
不是可交换的:ur'str'
有效,无效ru'str'
。(至少在 win7 上的 ipython 2.7.2 中)刚刚测试了
r
字符串并注意到如果\
是最后一个字符,它不会被视为文字而是转义结束引号,导致SyntaxError: EOL while scanning string literal
. 所以\\
仍然必须用于以\
反斜杠结尾的任何字符串的最终实例。python 3.x -
sys.getsizeof('cioa') == sys.getsizeof(r'cioa') == sys.getsizeof(u'cioa')
(带有 UTF8 语言的 Ubuntu 16.04)。同样,type('cioa') == type(r'cioa') == type(u'cioa')
。但是,原始字符串插值有所不同,所以sys.getsizeof('\ncioa') == sys.getsizeof(u'\ncioa') != sys.getsizeof(r'\ncioa')