r“ string” b“ string” u“ string” Python 2/3比较

时间:2019-02-05 11:42:26

标签: python python-3.x string python-2.7

我已经知道Python 2.7中的r"string"通常用于正则表达式模式。我还认为u"string"用于Unicode字符串。现在使用Python 3,我们看到了b"string"

我在不同的来源/问题(例如What does a b prefix before a python string mean?)中进行了搜索,但是很难在Python中看到所有带有前缀的 strings 的概况,尤其是在Python 2中vs 3。

问题:您是否有经验来记住Python中带前缀的不同类型的字符串?(或者也许有一个表,其中有一个列用于Python 2,一个列用于Python 3?)< / p>

注意:我已经阅读了一些问题和解答,但是我发现与所有前缀/ Python 2 + 3的比较都不容易记住

4 个答案:

答案 0 :(得分:5)

  1. u字符串,如果用于python 2中的unicode。如果您正在使用现代应用程序,则很可能应该忘记这一点-python 3中的默认字符串全部为unicode,并且从python 2迁移,您很可能会使用from __future__ import unicode_literals,这使得python 2的[几乎]相同
  2. b字符串用于原始字节-不知道 text ,而只是字节流。很少用作源的输入,通常是由于网络或底层代码的影响-读取二进制格式的数据,解压缩归档文件,使用加密库。

    通过str.encode从到b字符串移动到.decode

  3. r-strings 不是专门用于正则表达式的,它是“原始”字符串。与常规字符串文字不同,r字符串对转义字符没有任何特殊含义。即普通字符串abc\n的长度为4个字符,最后一个字符为“换行符”特殊字符。为了以文字形式提供它,我们使用了\的转义。对于原始字符串,r'abc\n'是5个长度的字符串,最后两个字符实际上是\n。经常在两个地方看到原始字符串:

    • regex模式-避免在模式中与实际的特殊字符转义

    • Windows系统的
    • 文件路径符号,因为Windows家族使用\作为分隔符,普通的字符串文字看起来像'C:\\dir\\file''\\\\share\\dir',而raw会更好:分别r'C:\dir\file'r'\\share\dir'

  4. 另一个值得注意的是 f-strings ,它在python 3.6中成为了一种简单而强大的格式化字符串的方式:

    • f'a equals {a} and b is {b}'将在运行时替换变量ab

答案 1 :(得分:3)

从python文档中获取文字:https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals

  

字节字面量始终以'b'或'B'为前缀;他们产生一个   字节类型的实例,而不是str类型。他们可能只   包含ASCII字符;数值为128或更大的字节   必须用转义符表示。

     

字符串和字节文字都可以选择加前缀   字母“ r”或“ R”;这样的字符串称为原始字符串,   作为文字字符的反斜杠。结果,在字符串文字中,   原始字符串中的'\ U'和'\ u'转义符未得到特殊处理。给定   Python 2.x的原始Unicode文字的行为与Python不同   3.x的'ur'语法不受支持。

  

前缀为'f'或'F'的字符串文字是格式化的字符串   文字;请参阅格式化的字符串文字。 'f'可以与   'r',但不包含'b'或'u',因此原始格式的字符串为   可能,但是格式化的字节常量是不可能的。

所以:

  • r 表示原始
  • b 表示字节
  • u 表示 unicode
  • f 表示格式

r b 在Python 2中已经可用,在许多其他语言中也是如此(有时非常方便)。

由于字符串文字在Python 2中不是unicode,因此创建了u字符串以提供对国际化的支持。从Python 3开始,u字符串是默认字符串,因此“ ...”在语义上与u“ ...”相同。

最后,在这些字符串中,f字符串是Python 2中唯一不支持的字符串。

答案 2 :(得分:2)

Python中实际上只有两种类型的字符串(或类似字符串的对象)。

第一个是'Unicode'字符串,它是一个字符序列。 第二个是字节(或“字节串”),是字节序列。

第一个是在Unicode规范中找到的一系列字母字符。 第二个是一系列介于0到255之间的整数,通常使用某些假定的编码方式将其呈现为文本,例如ASCII或UTF-8(这是在字节流中编码Unicode字符的规范)。

在Python 2中,默认的"my string"是一个字节串。 前缀'u'表示一个'Unicode'字符串,例如u"my string"

在Python 3中,“ Unicode”字符串成为默认字符串,因此"my string"等效于u"my string"。 要获取旧的Python 2字节串,请使用前缀b“ my string”(不是最旧的Python 3版本)。

还有另外两个前缀,但是它们不影响字符串对象的类型,仅影响其解释方式。 第一个是“原始”字符串,它们不解释转义字符,例如\ n或\ t。例如,原始字符串r"my_string\n"包含文字反斜杠和'n'字符,而"my_string\n"则在行末包含换行符。

第二个是在最新版本的Python 3中引入的:前缀为'f'的格式化字符串。其中,花括号用于显示要解释的表达式。例如,以下字符串:

my_object = 'avocado'
f"my {0.5 + 1.0, my_object} string"`

将解释为"my (1.5, avocado) string"(逗号创建一个元组)。读取代码后立即进行这种解释。随后,该字符串没有什么特别的。

最后,您可以使用多行字符串表示法:

"""this is my
multiline
string"""`

根据需要带有“ r”或“ f”说明符。

在Python 2中,如果您未使用前缀或仅使用'r'前缀,则为字节串;如果您使用'u'前缀,则为Unicode字符串。

在Python 3中,如果未使用前缀或仅使用'r','f'和'u'的组合,则它是Unicode字符串。如果您使用了'b'前缀,则它是一个字节串。显然不允许同时使用'b'和'u'。

答案 3 :(得分:0)

这是我观察到的(似乎被其他答案证实了):

Python 2                       Python 3

-----------------------------------------------

"hello"                        b"hello
b"hello"            <=>    
<type 'str'>                   <class 'bytes'>

-----------------------------------------------

u"hello"            <=>        "hello"
                               u"hello"
<type 'unicode'>               <class 'str'>