Python中字符串前“b”,“r”,“u”,“f”的作用

本文详细介绍了Python中字符串前缀b、r、u、f的作用,包括它们如何影响字符串的编码方式、转义机制及格式化操作。同时,还探讨了不同前缀下字符串与bytes类型之间的转换方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:https://www.jb51.net/article/176601.htm
原文有bug特参考:https://www.cnblogs.com/songzhenhua/p/13236794.html修改

Python中字符串前“b”,“r”,“u”,“f”的作用

1、字符串前加 u

例:u"我是含有中文字符组成的字符串。"

作用:

前缀u表示该字符串是unicode编码,Python2中用,用在含有中文字符的字符串前,防止因为编码问题,导致中文出现乱码。另外一般要在文件开关标明编码方式采用utf8。

Python3中,所有字符串默认都是unicode字符串。

2、字符串前加 r

例:r"\n\n\n\n”  表示一个普通字符串 \n\n\n\n,而不表示换行了。

作用:

去掉反斜杠的转义机制。

在普通字符串中,反斜线是转义符,代表一些特殊的内容,如换行符\n。前缀r表示该字符串是原始字符串,即\不是转义符,只是单纯的一个符号。

常用于特殊的字符如换行符、正则表达式、文件路径。

注意不能在原始字符串结尾输入反斜线,否则Python不知道这是一个字符还是换行符(字符串最后用\表示换行),会报错:

>>> print(r'C:\Program File\my\path''\')  
  File "<stdin>", line 1
    print(r'C:\Program File\my\path''\')
                                        ^
SyntaxError: EOL while scanning string literal

那如果是一个文件夹路径就是以\结尾怎么办呢,可以再接一个转义\的字符串:

>>> print(r'C:\Program File\my\path''\\')
C:\Program File\my\path\

或、

>>> print(r'C:\Program File\my\path'+'\\') 
C:\Program File\my\path\

注意
在python的正则表达式中,为表示模块re要求的单个反斜杠,需要在字符串中书写两个反斜杠,让解释器对其进行转义。换而言之,这里包含两层转义:解释器执行的转义和模块re执行的转义。实际上,在有些情况下也可使用单个反斜杠,让解释器自动对其进行转义,但请不要这样依赖解释器
如果你厌烦了两个反斜杆,可使用原始字符串,如r'python\.org'

3、字符串前加 b

例:response = b'Hello World!'

b' ' 表示这是一个 bytes 对象,用在Python3中,Python3里默认的str是unicode类。Python2的str本身就是bytes类。

作用:

b" "前缀表示:后面字符串是bytes 类型。

用处:

前缀b表示该字符串是bytes类型。

常用在如网络编程中,服务器和浏览器只认bytes类型数据。如:send 函数的参数和 recv 函数的返回值都是 bytes 类型。

附:
在 Python3 中,bytes 和 str 的互相转换方式是

str.encode('utf-8')
bytes.decode('utf-8')

4、字符串前加 f

import time
t0 = time.time()
time.sleep(1)
name ='processing'
print(f'{name} done in {time.time() - t0:.2f} s')

输出:

processing done in 1.00 s

Python3.6新加特性,前缀f用来格式化字符串。可以看出f前缀可以更方便的格式化字符串,比format()方法可读性高且使用方便。

而且加上f前缀后,支持在大括号内,运行Python表达式。

你还可以用fr前缀来表示原生字符串。

Python中bytes与字符串的相互转化

# bytes转字符串方式一
b=b'\xe9\x80\x86\xe7\x81\xab'
string=str(b,'utf-8')
print(string)
>>> 逆火
>>>
# bytes转字符串方式二
b=b'\xe9\x80\x86\xe7\x81\xab'
string=b.decode() # 第一参数默认utf8,第二参数默认strict
print(string)
>>> 逆火

# bytes转字符串方式三
b=b'\xe9\x80\x86\xe7\x81haha\xab'
string=b.decode('utf-8','ignore') # 忽略非法字符,用strict会抛出异常
print(string)
>>> 逆haha

# bytes转字符串方式四
b=b'\xe9\x80\x86\xe7\x81haha\xab'
string=b.decode('utf-8','replace') # 用?取代非法字符
print(string)
>>> 逆�haha�
>>>
# 字符串转bytes方式一
str1='逆火'
b=bytes(str1, encoding='utf-8')
print(b)
>>> b'\xe9\x80\x86\xe7\x81\xab'

# 字符串转bytes方式二
b=str1.encode('utf-8')
print(b)
>>> b'\xe9\x80\x86\xe7\x81\xab'

前缀u、b测试

下面的内容来源于:https://blog.csdn.net/anlian523/article/details/80504699,原文有错误,特转过来修改


字符串的类型只有两种(str,bytes),

>>> oath = '我爱妞'
>>> print(type(oath))
<class 'str'>
>>> print(len(oath))
3
>>> oath1 = u'我爱妞'
>>> print(type(oath1))
<class 'str'>
>>> print(len(oath1))
3
>>> print(oath==oath1)
True

发现无前缀,和前缀u,构造出来的字符串常量是一样的。

类型都是str,长度都是3,==判断返回true
其实,这里是因为,python3中,字符串的存储方式都是以Unicode字符来存储的,所以前缀带不带u,其实都一样。

>>> oath = '我爱妞'
>>> oath1 = u'我爱妞'
>>> print(oath is oath1)
False

is判断返回False

结论:字符串常量,前缀带不带u,都是一样的。

>>> utf8 = oath.encode('utf-8')
>>> print(type(utf8))
<class 'bytes'>
>>> print(len(utf8))
9
>>> print(utf8)
b'\xe6\x88\x91\xe7\x88\xb1\xe5\xa6\x9e'
>>> gbk = oath.encode('gbk')
>>> print(type(gbk))
<class 'bytes'>
>>> print(len(gbk))
6
>>> print(gbk)
b'\xce\xd2\xb0\xae\xe6\xa4'

可以发现任何str类型的字符串,在经过encode(‘utf-8’)后,通过utf-8编码,将Unicode字符转换为对应的以字节方式存储的若干十六进制数。

根据如上程序以及结果,可以发现,utf-8用三个字节(6个十六进制数)来表示一个中文字符,而gbk用两个字节(4个十六进制数)来表示一个中文字符。

结论:encode()函数根据括号内的编码方式,把str类型的字符串转换为bytes字符串,字符对应的若干十六进制数。

既然str存储的是Unicode字符,那么也可以Unicode编码来存储str,形如\u1234

>>> u'\u5220\u9664'
'删除'
>>> '\u5220\u9664'
'删除'

发现\u后面跟四个十六进制数,就可以代表一个Unicode字符,同样的,前缀带不带u都一样。

>>> test = u'\u5220\u9664'
>>> print(len(test))
2
>>> print(test)
删除
>>> test1 = test.encode('utf-8')
>>> print(test1)
b'\xe5\x88\xa0\xe9\x99\xa4'
>>> print(type(test1))
<class 'bytes'>

结论:str类型的字符串,每个字符用字符本身或者\u1234来表示都可以,后者则是直接是Unicode编码。但打印时都是字符本身。

bytes字符串的组成形式,必须是十六进制数,或者ASCII字符:

>>> x = b'abc'
>>> x
b'abc'
>>> b'好'
  File "<stdin>", line 1
    b'好'
        ^
SyntaxError: bytes can only contain ASCII literal characters.

提示错误:bytes只能包含ASCII字符。

还可以对bytes取索引,所以bytes类型也可以用for循环来迭代。取索引,将所在元素的数,转换为十进制数。

>>> g=b'\xce\xd2\xb0\xae\xe6\xa4'
>>> g[0]
206
>>> out = open('test.txt','w',encoding = 'utf-8')
>>>  
>>> test = u'\u5220\u9664'
>>> print(len(test))
2
>>> print(test)
删除
>>> test1 = test.encode('utf-8')
>>> print(test1)
b'\xe5\x88\xa0\xe9\x99\xa4'
>>> print(type(test1))
<class 'bytes'>
>>>
>>> out.write(test)
2
>>> out.close()
<think>嗯,用户想了解Python字符串带'r'的作用,也就是r''的用法。首先,我需要回忆一下相关的知识。记得r是raw的缩写,表示原始字符串,不会处理转义字符。比如,在普通字符串里,\n代表换行,但如果面加了r,就会直接显示成两个字符\和n。不过,用户可能需要具体的例子和解释。 接下来,我得整理一下r字符串的主要用途。首先,处理正则表达式的时候,经常会有很多反斜杠,用原始字符串可以避免重复写双反斜杠。比如re模块中的模式匹配,使用r'\d+'会比'\d+'更方便,因为后者需要写成'\\d+'。然后,文件路径的处理,特别是在Windows系统中,路径分隔符是反斜杠,用原始字符串可以避免转义问题,比如r'C:\Users\Documents'。 还要注意一些细节,比如r字符串不能以奇数个反斜杠结尾,否则会报错。例如,r'abc\' 是不合法的,因为最后一个反斜杠会转义后面的引号。另外,虽然r字符串会忽略转义,但如果是引号面有反斜杠,还是会被转义,比如r'\"'实际上会保留反斜杠和引号,变成\",而不是转义成单独的引号。 用户可能还会想知道r和其他缀的区别,比如u、b、f,但当问题只涉及r,所以可能需要稍微提一下,但重点还是放在r上。不过根据引用资料,用户提供的引用里提到了u、b、f,但用户的问题是明确关于r''的,所以应该专注于r的用法。 然后,考虑用户可能的实际应用场景。比如处理正则表达式时,或者文件路径,或者需要包含大量反斜杠的字符串。这时候原始字符串可以简化代码,减少错误。举个例子,如果用户要写一个正则表达式匹配Windows路径,用r'C:\\Users\\.*'可能更清晰。 另外,需要指出的是,r缀只在字符串字面值中有效,不能用于变量或表达式。也就是说,不能先定义一个变量s = '\d',然后用r+s,这样r缀不起作用。只能在定义字符串的时候加上r。 可能还需要提到,即使使用r字符串,某些情况下还是需要处理反斜杠,比如在正则表达式中,虽然模式字符串用了r,但正则引擎可能仍然需要反斜杠,这时候r字符串只是让编写更方便,不需要双重转义。 最后,总结一下r''的作用:保留字符串原始形态,不进行转义处理,适用于正则、路径、特殊字符保留等场景。同时,注意其限制,比如不能以奇数个反斜杠结尾,以及只影响字面值。 用户提供的引用里,引用1和3详细解释了r字符串的用途,引用4有一个例子,显示str2 = u"你好",但用户的问题是关于r的,所以重点参考引用1和3。引用2提到字符串操作,可能相关性不大,但可以忽略。 检查是否有遗漏点,比如原始字符串对于Unicode的处理,但r主要处理转义字符,和u不同,u是处理Unicode,不过在Python3中,默认字符串是Unicode,所以u缀已经不再必要,但在Python2中可能有用。不过用户的问题没有提到Python版本,所以可能不需要深入讨论。 确保回答结构清晰,分点说明,举例恰当,并附上相关问题。比如相关问题可能涉及其他缀的区别,或者r字符串的常见错误,如反斜杠结尾的问题。</think>### Python中r''原始字符串的用法及作用Python中,字符串缀`r`表示**原始字符串(Raw String)**,其核心作用是**消除转义字符的特殊含义**,使字符串中的每个字符(包括反斜杠`\`)都按字面意义直接解析。以下是具体说明: --- #### 一、核心作用 1. **禁用转义字符** 普通字符串中,反斜杠`\`用于表示转义字符(如`\n`为换行),而`r''`会直接保留反斜杠和后续字符的原始形式。 ```python path = r'C:\Users\Documents\file.txt' # 输出:C:\Users\Documents\file.txt normal_str = 'C:\\Users\\Documents\\file.txt' # 等价非原始字符串写法 ``` 2. **简化正则表达式和文件路径** 在正则表达式或Windows文件路径中,频繁使用反斜杠时,`r''`可避免重复书写双反斜杠: ```python import re pattern = r'\d+\.\d+' # 匹配数字(如3.14),等价于'\\d+\\.\\d+' ``` --- #### 二、典型应用场景 1. **处理正则表达式** 正则表达式中常用`\d`、`\w`等元字符,使用`r''`可避免语法冲突: ```python re.findall(r'\b[a-z]+\b', 'hello world') # 匹配纯小写单词 ``` 2. **文件路径操作** Windows路径中的反斜杠在普通字符串中需转义为`\\`,而`r''`可直接使用原生路径: ```python with open(r'C:\data\report.txt', 'r') as f: content = f.read() ``` 3. **保留特殊字符格式** 需保留`\t`(制表符)、`\n`(换行符)等字符的字面意义时: ```python raw_str = r'Column1\tColumn2\n' # 输出:Column1\tColumn2\n ``` --- #### 三、注意事项 1. **不能以奇数个反斜杠结尾** `r''`中若以单个反斜杠结尾会引发语法错误,因为反斜杠会转义结束引号: ```python # 错误示例:r'text\' # 正确写法:r'text\\' 或 'text\\' ``` 2. **仅作用于字面值,不处理变量或表达式** `r`缀仅适用于直接定义的字符串,无法通过拼接变量实现原始字符串效果: ```python s = '\d+' combined = r'pattern: ' + s # s中的\d仍会被解释为转义字符 ``` 3. **引号的转义仍需处理** 即使使用`r''`,字符串内部若包含引号仍需通过`\"`或`\'`转义: ```python raw_quote = r'She said: \"Hello\"' # 输出:She said: \"Hello\" ``` --- #### 四、与其他缀的对比 | 缀 | 功能 | 示例 | |------|--------------------------|--------------------| | `r` | 原始字符串(禁用转义) | `r'C:\data'` | | `f` | 格式化字符串(插值变量) | `f'Value: {x}'` | | `b` | 字节字符串 | `b'byte_data'` | | `u` | Unicode字符串Python2) | `u'你好'` | ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔚蓝慕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值