前言
之前在写的 第4章 Unicode 文本和字节序列,也就是来自fluent python第二版这个读书笔记的时候已经写过。不过这里根据现实代码情况,在补充一些可能较为浅显,但非常容易碰到的情况。
raw string
在 Python 中,raw string 是通过在字符串前加上字母 r
或 R
来创建的,比如 r"your_string"
。它的主要作用是告诉解释器对字符串中的反斜杠 \
不进行转义处理。通常,反斜杠在字符串中被用作转义字符,例如 \n
表示换行,\t
表示制表符等。
使用 raw string 的好处包括:
-
处理文件路径:在涉及 Windows 文件路径时,反斜杠通常用于分隔目录,比如
C:\new_folder\my_file.txt
。如果不使用 raw string,必须将每个反斜杠写成双反斜杠\\
,即C:\\new_folder\\my_file.txt
。使用 raw string 可以避免这种情况,直接写成r"C:\new_folder\my_file.txt"
。 -
正则表达式:正则表达式中也大量使用反斜杠来转义特殊字符。使用 raw string 可以使正则表达式的表达更加直观和易读。例如,
r"\d+"
表示匹配一个或多个数字字符。 -
提高可读性:当字符串中包含很多需要转义的字符时,raw string 可以使代码更简洁和易读。
需要注意的是,raw string 的最后一个字符不能是单个反斜杠,因为这会导致语法错误。
File "test.py", line 3
a = r"""aaa\"""
^
SyntaxError: EOF while scanning triple-quoted string literal
a = r"""aaa\\"""
print(a)
# aaa\\
再举个例子:
print(r'\\\\\\' == '\\\\\\\\\\\\')
# True
print('\\\\\\\\\\\\')
# \\\\\\
print(r'\\\\\\')
# \\\\\\
Python 字符串转义与编码解码
1. 为什么要用 "\\"
替换 %
?
背景
很多网页会用%uXXXX
的形式表示Unicode字符,比如%u4E0A%u6D77
(表示“上海”)。如果想让Python识别这些Unicode转义,需要把它们转换成\uXXXX
的形式。
Python 字符串中的反斜杠
- 在Python字符串字面量中,
\
是转义符。 - 如果想要表示一个真正的反斜杠字符,需要写成
"\\"
。
替换操作
c = "%u4E0A%u6D77"
d = c.replace("%", "\\")
print(d) # 输出: \u4E0A\u6D77
- 这里
"\\"
只是Python的写法,实际效果是替换为一个反斜杠\
。
总结
你不是用“两个反斜杠替换%”,而是代码里用"\\"
来表示一个反斜杠。最终是把%
替换为\
,让Python能识别Unicode转义。
2. encode
和 decode
的用法与区别
基础概念
encode(编码方式)
:把字符串转为字节流(bytes)。decode(编码方式)
:把字节流转回字符串。
常见配对
- 正确配对:
str.encode('utf-8')
→bytes.decode('utf-8')
- 错误配对(会报错):
str.encode('utf-8')
→bytes.decode('gbk')
(编码和解码方式不一致)
text = "你好"
# 正确
b = text.encode("utf-8")
s = b.decode("utf-8") # OK
# 错误
s = b.decode("gbk") # 通常会报错,编码和解码方式不一致
unicode_escape
的特殊性
unicode_escape
不是严格的字符集解码器,而是把字符串中的\uXXXX
等转义序列还原为真正的字符。- 它不会像
utf-8
、gbk
那样校验字节流是否合法,只是做转义。
s = r'\u4f60\u597d'
print(s.encode().decode("unicode_escape")) # 输出: 你好
r
前缀表示原始字符串,内容就是\u4f60\u597d
。encode()
默认用utf-8
,不会报错,因为内容全是ASCII。(unicode也支持哈,防止语言有歧义)decode("unicode_escape")
把\u4f60\u597d
识别为“你好”。