基础篇 · Foundations
lv.1 入门
kp-008
字符串与文本处理
1. 一句话定义
str 是不可变的 Unicode 字符序列,支持切片、丰富方法与三种格式化方式(首选 f-string);文本进出的关键是编码(UTF-8)。
2. 为什么重要
绝大多数程序在做文本进出:日志、配置、JSON、网络协议。f-string 与切片是日常高频操作;编码错误是跨语言迁移者最常见的翻车点。
3. 前置知识
kp-004(str 属不可变序列族)。
4. 核心概念
- 不可变:所有"修改"方法都返回新串(与 kp-004 呼应)。
- 索引与切片:
s[i],s[a:b:c](步长),负下标从尾部数;切片不越界不报错。 - 格式化三式:f-string(3.6+,首选)、
str.format()、%旧式(读旧代码要认识)。 - 编码:
str是"字符"(码点)序列;字节串bytes是编码后的数据。入站decode,出站encode,默认 UTF-8。
5. 原理与机制
python
s = "Hello, Python"
s[7:13] # 'Python'
s[::-1] # 反转
s.upper() # 'HELLO, PYTHON'(返回新串,s 不变)
" x ".strip() # 'x'
"a,b,c".split(",") # ['a', 'b', 'c']
"-".join(["a","b"])# 'a-b' (join 比循环 += 拼接高效得多)
# f-string
name, score = "Amy", 91.667
f"{name} 得分 {score:.1f}" # 'Amy 得分 91.7'
f"{name=}" # 3.12 前 'name='Amy'';调试利器
f"{1234567:,}" # '1,234,567'编码:
python
"蛇".encode("utf-8") # b'\xe8\x9b\x87'
b'\xe8\x9b\x87'.decode("utf-8") # '蛇'6. 关键事实(模型/图示)
text
str(码点序列) ──encode──► bytes(字节序列)
str ◄──decode──────────── bytes
读文件/网络进来的是 bytes → 必须 decode 成 str 才能当文本处理7. 直观类比
str 像乐谱(抽象的音),bytes 像录音文件(具体的声);encode 是录音,decode 是照谱演奏。录音拿错了制式(编码不对)播放出来就是杂音——UnicodeDecodeError 就是那个杂音。
8. 实例与案例
python
# 清洗一行 CSV 数据
line = " Amy , 90 \n"
name, score = (p.strip() for p in line.strip().split(","))复杂模式匹配入门(正则完整语法不在本知识库展开,入口在此):
python
import re
re.findall(r"\d+", "room 12, floor 3") # ['12', '3']9. 常见误区
- 循环
+=拼接构建大字符串 —— O(n²);用"".join(parts)或先收集再 join。 strip()只去空格? 默认去空白,但可传参数去掉指定字符集合:"xxaxx".strip("x")→'a'。- 以为字符串是字符数组可直接赋值 ——
s[0] = "h"报错;转list改完再join。 - 混淆 str 与 bytes —— 对
b"..."用字符串方法(如.split()传 str 参数)会TypeError。
10. 自测题
"python"[1:-1]结果是什么?f"{3.14159:.2f}"、f"{0.25:.0%}"各输出什么?"".join()与循环+=相比优势是什么?底层原因一句话?
参考答案
'ytho'(从下标 1 到倒数第 1 个之前)。'3.14';'25%'(:.0% 是百分比格式)。- join 一次性计算总长度分配结果,避免不可变字符串反复重建导致的平方级开销。
11. 与其他知识点的关系
12. 延伸阅读
- PEP 498(f-string);PEP 701(3.12 的 f-string 语法放开,见 kp-039)
- 字符串方法速查:https://docs.python.org/zh-cn/3/library/stdtypes.html#string-methods