>>>PyPathPython 学习站
首页›基础篇›kp-008
基础篇 · Foundations lv.1 入门 kp-008

字符串与文本处理

前置知识:kp-004

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. 常见误区

  1. 循环 += 拼接构建大字符串 —— O(n²);用 "".join(parts) 或先收集再 join。
  2. strip() 只去空格? 默认去空白,但可传参数去掉指定字符集合:"xxaxx".strip("x") → 'a'。
  3. 以为字符串是字符数组可直接赋值 —— s[0] = "h" 报错;转 list 改完再 join。
  4. 混淆 str 与 bytes —— 对 b"..." 用字符串方法(如 .split() 传 str 参数)会 TypeError。

10. 自测题

  1. "python"[1:-1] 结果是什么?
  2. f"{3.14159:.2f}"、f"{0.25:.0%}" 各输出什么?
  3. "".join() 与循环 += 相比优势是什么?底层原因一句话?
参考答案
  1. 'ytho'(从下标 1 到倒数第 1 个之前)。
  2. '3.14';'25%'(:.0% 是百分比格式)。
  3. join 一次性计算总长度分配结果,避免不可变字符串反复重建导致的平方级开销。

11. 与其他知识点的关系

  • kp-009 列表与元组:切片语法同源。
  • kp-016 文件与 IO:编码问题的主战场。
  • kp-011 推导式:split/join 常与推导式配合。

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