“u”和“r”字符串标志具体做什么,什么是原始字符串文字?

2021-01-26 07:05:03 发布

您现在位置:Python中文网/ 问答频道 /正文

当我问this question时,我意识到我对原始字符串知之甚少。对于一个自称是Django教练的人来说,这太糟糕了。

我知道什么是编码,而且我知道u''单独做什么,因为我得到的是Unicode。

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

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

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

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

3条回答
网友
1楼 ·

没有真正的“rawstring”;有rawstring literals,这正是在开始引号前用'r'标记的字符串文本。

“raw string literal”是一种与string literal稍有不同的语法,其中反斜杠\被视为意味着“只是一个反斜杠”(除非它正好位于引号之前,否则将终止该literal)--没有“转义序列”来表示换行符、制表符、反空格、表单源等等。在普通的字符串文本中,每个反斜杠必须加倍,以避免被当作转义序列的开始。

这种语法变体之所以存在,主要是因为正则表达式模式的语法中有大量的反斜杠(但永远不会在结尾,所以上面的“except”子句无关紧要),而且如果避免将每个反斜杠都加倍,它看起来会更好一些——仅此而已。它还获得了一些流行来表示本机Windows文件路径(使用反斜杠而不是像在其他平台上那样使用常规斜杠),但这很少需要(因为普通斜杠在Windows上也能正常工作)和不完美(由于上面的“except”子句)。

r'...'是一个字节字符串(在Python 2.*中),ur'...'是一个Unicode字符串(同样,在python2.*中),其他三种引用也会生成完全相同类型的字符串(例如r'...'r'''...'''r"..."r"""..."""都是字节字符串,等等)。

不知道“goingback”是什么意思-没有本质上的后退和前进方向,因为没有原始字符串type,它只是一种替代语法,可以表示完全正常的字符串对象、字节或unicode。

是的,在Python2.*中,u'...'当然是而不是'...'--前者是unicode字符串,后者是字节字符串。文字的编码方式是完全正交的。

例如,考虑(Python 2.6):

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

Unicode对象当然占用了更多的内存空间(显然,对于非常短的字符串来说,差别很小;-)。

网友
2楼 ·

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

r根本不会改变类型,它只是改变字符串文本的解释方式。如果没有r,反斜杠将被视为转义字符。使用r,反斜杠被视为文字。不管怎样,类型都是一样的。

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

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

网友
3楼 ·

“原始字符串”表示按其显示的方式存储。例如,'\'只是一个反斜杠而不是一个转义

相关问题