我已经知道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的比较都不容易记住
答案 0 :(得分:5)
from __future__ import unicode_literals
,这使得python 2的[几乎]相同b字符串用于原始字节-不知道 text ,而只是字节流。很少用作源的输入,通常是由于网络或底层代码的影响-读取二进制格式的数据,解压缩归档文件,使用加密库。
通过str
和.encode
从到b字符串移动到.decode
r-strings 不是专门用于正则表达式的,它是“原始”字符串。与常规字符串文字不同,r字符串对转义字符没有任何特殊含义。即普通字符串abc\n
的长度为4个字符,最后一个字符为“换行符”特殊字符。为了以文字形式提供它,我们使用了\
的转义。对于原始字符串,r'abc\n'
是5个长度的字符串,最后两个字符实际上是\
和n
。经常在两个地方看到原始字符串:
regex模式-避免在模式中与实际的特殊字符转义
文件路径符号,因为Windows家族使用\
作为分隔符,普通的字符串文字看起来像'C:\\dir\\file'
或'\\\\share\\dir'
,而raw会更好:分别r'C:\dir\file'
和r'\\share\dir'
另一个值得注意的是 f-strings ,它在python 3.6中成为了一种简单而强大的格式化字符串的方式:
f'a equals {a} and b is {b}'
将在运行时替换变量a
和b
。答案 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 在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'>