为了账号安全,请及时绑定邮箱和手机立即绑定

“u”和“r”字符串标志究竟做了什么,以及什么是原始字符串文字?

“u”和“r”字符串标志究竟做了什么,以及什么是原始字符串文字?

慕后森 2019-05-27 13:59:07
“u”和“r”字符串标志究竟做了什么,以及什么是原始字符串文字?在问这个问题时,我意识到我对原始字符串知之甚少。对于那些自称是Django训练师的人来说,这很糟糕。我知道编码是什么,而且我知道u''自从我得到什么是Unicode以后我们独自做了什么。但到底r''做了什么呢?它会产生什么样的字符串?最重要的是,他到底做了ur''什么?最后,有没有可靠的方法从Unicode字符串返回到简单的原始字符串?啊,顺便说一句,如果您的系统和文本编辑器字符集设置为UTF-8,u''实际上是做什么的吗?
查看完整描述

4 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

没有任何“原始字符串 ”; 有原始字符串文字,它们正是'r'在开头引号之前标记的字符串文字。

“原始字符串文字”是字符串文字的略有不同的语法,其中反斜杠,\意思是“只是反斜杠”(除非它恰好在引用之前,否则将终止字面值) - 否“转义序列”代表换行符,制表符,退格键,换页符等。在普通的字符串文字中,每个反斜杠必须加倍,以避免被视为转义序列的开始。

这种语法变体的存在主要是因为正则表达式模式的语法带有反斜杠(但从不在最后,所以上面的“except”子句无关紧要)并且当你避免将它们加倍时看起来好一点 - - 就这样。它也表达了一些流行来表达本机Windows文件路径(使用反斜杠而不是像其他平台上的常规斜杠),但这很少需要(因为正常的斜杠在Windows上工作得很好)并且不完美(由于“except”子句以上)。

r'...'是一个字节串(在Python 2 *),ur'...'是Unicode字符串(再次,在Python 2 *),以及任何其他3种引用的也产生完全相同的类型字符串(因此,例如r'...'r'''...'''r"..."r"""..."""都是字节串,依此类推)。

不确定你的意思是“ 返回 ” - 没有内在的后退和前进方向,因为没有原始字符串类型,它只是表达完全正常的字符串对象,字节或unicode的替代语法。

是的,在Python 2 *,u'...' 当然总是从刚不同'...'-前者是一个unicode字符串,后者是一个字节的字符串。可以表达文字的编码是完全正交的问题。

例如,考虑(Python 2.6):

>>> sys.getsizeof('ciao')

28

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

34

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


查看完整回答
反对 回复 2019-05-27
?
喵喔喔

TA贡献1735条经验 获得超5个赞

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

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

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

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


查看完整回答
反对 回复 2019-05-27
?
隔江千里

TA贡献1906条经验 获得超10个赞

“u”前缀表示值具有类型unicode而不是str

具有“r”前缀的原始字符串文字会转义其中的任何转义序列,因此它们len(r"\n")是2.因为它们转义转义序列,所以不能使用单个反斜杠结束字符串文字:这不是有效的转义序列(例如r"\")。

“Raw”不是该类型的一部分,它只是表示价值的一种方式。例如,"\\n"r"\n"是相同的值,就像320x200b100000是相同的。

你可以有unicode原始字符串文字:

>>> u = ur"\n">>> print type(u), len(u)<type 'unicode'> 2

源文件编码仅确定如何解释源文件,否则不会影响表达式或类型。但是,建议避免使用ASCII以外的编码改变含义的代码:

使用ASCII(或UTF-8,用于Python 3.0)的文件不应具有编码cookie。Latin-1(或UTF-8)只应在注释或docstring需要提及需要Latin-1的作者名称时使用; 否则,使用\ x,\ u或\ U转义是在字符串文字中包含非ASCII数据的首选方法。


查看完整回答
反对 回复 2019-05-27
  • 4 回答
  • 0 关注
  • 842 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信