协慌网

登录 贡献 社区

字符串标志 “u” 和“r”到底是做什么的,什么是原始字符串文字?

在问这个问题时,我意识到我对原始字符串不了解很多。对于自称是 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 对象当然会占用更多的存储空间(很短的字符串,很明显;-) 差别很小。

python 中有两种类型的字符串:传统的str类型和较新的unicode类型。如果键入字符串文字,而u ,则将得到旧的str类型,该类型存储 8 位字符,而u ,则将得到较新的unicode类型,该类型可以存储任何 Unicode 字符。

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

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

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

“原始字符串”表示将其存储为原样。例如, '\'只是一个反斜杠,而不是一个转义符