“u”和“r”字符串前缀究竟做了什么,什么是原始字符串文字?

新手上路,请多包涵

在问 这个问题 时,我意识到我对原始字符串知之甚少。对于自称是 Django 培训师的人来说,这很糟糕。

我知道编码是什么,而且我知道 u'' 是什么,因为我知道什么是 Unicode。

  • 但是 r'' 究竟做了什么?它会产生什么样的字符串?

  • 最重要的是, ur'' 到底是做什么的?

  • 最后,是否有任何可靠的方法可以从 Unicode 字符串返回到简单的原始字符串?

  • 啊,顺便说一下,如果您的系统和文本编辑器字符集设置为 UTF-8,那么 u'' 真的有什么作用吗?

原文由 e-satis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 498
2 个回答

没有真正的“原始 _字符串_”;有 raw string literals ,它们正是在开始引号之前用 'r' 标记的字符串文字。

“原始字符串文字”是字符串文字的一种略有不同的语法,其中反斜杠 \ 被视为“只是一个反斜杠”(除非它恰好出现在引号之前终止文字)——没有“转义序列”来表示换行符、制表符、退格符、换页符等。在普通的字符串文字中,每个反斜杠必须加倍以避免被视为转义序列的开头。

这种语法变体的存在主要是因为正则表达式模式的语法中有很多反斜杠(但从不在末尾,所以上面的“except”子句无关紧要)并且当你避免将它们中的每一个加倍时它看起来会好一点 - - 就这样。表示本机 Windows 文件路径(使用反斜杠而不是其他平台上的常规斜杠)也很受欢迎,但这很少需要(因为普通斜杠在 Windows 上也能很好地工作)并且不完美(由于“except”子句多于)。

r'...' 是一个字节字符串(在 Python 2.* 中), ur'...' 是一个 Unicode 字符串(同样,在 Python 2.* 中),其他三种引用中的任何一种也是produces exactly the same types of strings (so for example r'...' , r'''...''' , r"..." , r"""...""" are all byte strings, and so on ).

不确定“ _返回_”是什么意思 - 本质上没有前后方向,因为没有原始字符串 类型,它只是表达完全正常的字符串对象、字节或 unicode 的另一种语法。

是的,在 Python 2.* 中, u'...' 当然 总是 不同于 '...' 前者是一个 unicode 字符串,后者是一个字节字符串。文字可能用什么编码来表达是一个完全正交的问题。

例如,考虑(Python 2.6):

 >>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34

Unicode 对象当然需要更多的内存空间(对于很短的字符串来说差别很小,很明显 ;-)。

原文由 Alex Martelli 发布,翻译遵循 CC BY-SA 3.0 许可协议

Python 2 中有两种类型的字符串:传统的 str 类型和较新的 unicode 类型。如果你键入一个没有前面的 u 的字符串文字,你会得到旧的 str 存储 8 位字符的类型,而前面有 u 较新的 unicode 可以存储任何 Unicode 字符的类型。

r 根本没有改变类型,它只是改变了字符串文字的解释方式。如果没有 r ,反斜杠将被视为转义字符。对于 r ,反斜杠被视为文字。无论哪种方式,类型都是相同的。

ur 当然是一个 Unicode 字符串,其中反斜杠是文字反斜杠,而不是转义码的一部分。

您可以尝试使用 str() 函数将 Unicode 字符串转换为旧字符串,但是如果有任何 unicode 字符无法在旧字符串中表示,您将得到一个异常。如果愿意,您可以先用问号替换它们,但这当然会导致这些字符不可读。如果要正确处理 unicode 字符,不建议使用 str 类型。

原文由 Mark Byers 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题