python的raw string与编码

前言

之前在写的 第4章 Unicode 文本和字节序列,也就是来自fluent python第二版这个读书笔记的时候已经写过。不过这里根据现实代码情况,在补充一些可能较为浅显,但非常容易碰到的情况。

raw string

在 Python 中,raw string 是通过在字符串前加上字母 rR 来创建的,比如 r"your_string"。它的主要作用是告诉解释器对字符串中的反斜杠 \ 不进行转义处理。通常,反斜杠在字符串中被用作转义字符,例如 \n 表示换行,\t 表示制表符等。

使用 raw string 的好处包括:

  1. 处理文件路径:在涉及 Windows 文件路径时,反斜杠通常用于分隔目录,比如 C:\new_folder\my_file.txt。如果不使用 raw string,必须将每个反斜杠写成双反斜杠 \\,即 C:\\new_folder\\my_file.txt。使用 raw string 可以避免这种情况,直接写成 r"C:\new_folder\my_file.txt"

  2. 正则表达式:正则表达式中也大量使用反斜杠来转义特殊字符。使用 raw string 可以使正则表达式的表达更加直观和易读。例如,r"\d+" 表示匹配一个或多个数字字符。

  3. 提高可读性:当字符串中包含很多需要转义的字符时,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. encodedecode 的用法与区别

基础概念

  • 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-8gbk那样校验字节流是否合法,只是做转义。
s = r'\u4f60\u597d'
print(s.encode().decode("unicode_escape"))  # 输出: 你好
  • r前缀表示原始字符串,内容就是\u4f60\u597d
  • encode()默认用utf-8,不会报错,因为内容全是ASCII。(unicode也支持哈,防止语言有歧义)
  • decode("unicode_escape")\u4f60\u597d识别为“你好”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值