r“string”b“string”u“string”Python 2/3比较
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了r“string”b“string”u“string”Python 2/3比较相关的知识,希望对你有一定的参考价值。
我已经知道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文档: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中唯一不支持的字符串。
- u-strings如果是python中的unicode 2.最有可能你应该忘记这一点,如果你正在使用现代应用程序 - python 3中的默认字符串都是unicode,如果你从python 2迁移,你最有可能使用
from __future__ import unicode_literals
,这对于python 2来说几乎是相同的 - b-strings用于原始字节 - 不知道文本,而只是字节流。很少用作源的输入,通常是网络或低级代码的结果 - 以二进制格式读取数据,解压缩存档,使用加密库。
通过
str
和.encode
从/到b-string移动到.decode
- r-strings不是专门用于正则表达式,这是“原始”字符串。与常规字符串文字不同,r-string对转义字符没有任何特殊含义。即普通字符串
abc
长度为4个字符,最后一个字符是“newline”特殊字符。为了以字面值提供,我们使用进行转义。对于原始字符串,
r'abc '
是5长度字符串,最后两个字符实际上是和
n
。经常看到原始字符串的两个地方: 正则表达式模式 - 不要乱丢在模式中的实际特殊字符 Windows系统的文件路径表示法,因为windows系列使用作为分隔符,正常的字符串文字看起来像
'C:\dir\file'
或'\\share\dir'
,而raw会更好:r'C:dirfile'
和r'\sharedir'
- 另一个值得注意的是f-strings,它以python 3.6的形式出现,是一种简单而有效的格式化字符串的方法:
f'a equals {a} and b is {b}'
将在运行时替换变量a
和b
。
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'字符,而"my_string
"
包含行尾的换行符。
第二个是在最新版本的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'。
这是我观察到的(似乎通过其他答案证实):
Python 2 Python 3
-----------------------------------------------
"hello" b"hello
b"hello" <=>
<type 'str'> <class 'bytes'>
-----------------------------------------------
u"hello" <=> "hello"
u"hello"
<type 'unicode'> <class 'str'>
以上是关于r“string”b“string”u“string”Python 2/3比较的主要内容,如果未能解决你的问题,请参考以下文章