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

问题描述 投票:2回答:4

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

我已经在不同的来源/问题中搜索过这些内容,例如What does a b prefix before a python string mean?,但很难在Python中看到所有这些带有前缀的字符串的大图,尤其是Python 2 vs 3。

问题:您是否有经验可以记住Python中带有前缀的不同类型的字符串? (或者可能是一个包含Python 2列和一个Python 3列的表?)

注意:我已经阅读了几个问题+答案,但我没有找到一个容易记住与所有前缀/ Python 2 + 3的比较

python python-3.x string python-2.7
4个回答
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表示字节
  • 你的意思是unicode
  • f表示格式

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

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

最后,从那些开始,f-string是Python 2中唯一不支持的字符串。


5
投票
  1. u-strings如果是python中的unicode 2.最有可能你应该忘记这一点,如果你正在使用现代应用程序 - python 3中的默认字符串都是unicode,如果你从python 2迁移,你最有可能使用from __future__ import unicode_literals,这对于python 2来说几乎是相同的
  2. b-strings用于原始字节 - 不知道文本,而只是字节流。很少用作源的输入,通常是网络或低级代码的结果 - 以二进制格式读取数据,解压缩存档,使用加密库。 通过str.encode从/到b-string移动到.decode
  3. r-strings不是专门用于正则表达式,这是“原始”字符串。与常规字符串文字不同,r-string对转义字符没有任何特殊含义。即普通字符串abc\n长度为4个字符,最后一个字符是“newline”特殊字符。为了以字面值提供,我们使用\进行转义。对于原始字符串,r'abc\n'是5长度字符串,最后两个字符实际上是\n。经常看到原始字符串的两个地方: 正则表达式模式 - 不要乱丢在模式中的实际特殊字符 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

2
投票

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

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

第一个是Unicode规范中的一系列字母字符。第二个是0到255之间的一系列整数,它们通常使用一些假设的编码(如ASCII或UTF-8(用于在字节流中编码Unicode字符的规范))呈现给文本。

在Python 2中,默认的"my string"是一个bytestring。前缀“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'前缀,那么它是一个bytestring。显然不允许同时使用'b'和'u'。


0
投票

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

Python 2                       Python 3

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

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

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

u"hello"            <=>        "hello"
                               u"hello"
<type 'unicode'>               <class 'str'>
© www.soinside.com 2019 - 2024. All rights reserved.