第8章 常用标准库
字符串与正则、日期时间、os/sys/random/math——不装第三方库也能干的活。
本章学习目标
- 能用 re 做匹配、查找与替换
- 能用 datetime 做日期计算与格式化
- 能用 os/sys 处理路径与命令行参数
- 能说出 random 与 math 的常用函数
本章导览
核心内容
8.1
字符串与正则表达式
文本清洗的主力:字符串方法处理不了的模式匹配,交给 re。
能写常用正则(数字、邮箱、日期)能用 findall/search/sub 提取替换能看懂贪婪与非贪婪
知识点
常用元字符
- \d 数字、\w 字母数字下划线、\s 空白、. 任意字符;* + ? {n,m} 控制次数。
- [] 字符集合,^ $ 匹配开头结尾,() 分组、| 或。
- 原始字符串 r"\d+" 可以少写转义,推荐正则一律加 r。
四个常用函数
- re.findall 返回所有匹配(列表),最常用于批量提取。
- re.search 找第一个,返回 Match;re.sub 替换。
- re.compile 预编译,循环里反复用同一个模式时更快。
贪婪与非贪婪
- 默认贪婪:.* 会尽可能多匹配;加 ? 变成非贪婪 .*?。
- 提取标签内容、引号内容时几乎都要用非贪婪。
代码示例
▶ 提取数字
import re
text = "订单 A12 金额 89.5 元,订单 B7 金额 120 元"
print(re.findall(r"\d+\.?\d*", text))👀 运行结果
['12', '89.5', '7', '120']
▶ 替换手机号中间四位
import re
phone = "13812345678"
print(re.sub(r"(\d{3})\d{4}(\d{4})", r"\1****\2", phone))👀 运行结果
138****5678
▶ 校验邮箱
import re
pat = r"^[\w.+-]+@[\w-]+\.[\w.]+$"
print(bool(re.match(pat, "abc@163.com")), bool(re.match(pat, "abc@163")))👀 运行结果
True False
常见错误
⚠️ 踩坑与解决
re.error: bad character range
→ 中括号里的 - 没转义;把 - 放最前面或用 \-findall 返回空列表
→ 模式写错(多了空格、漏了 r 导致转义丢失);先在小文本上 print 模式验证
💡 正则先写“最小能匹配的样例”,再逐步加条件,比一次写全更稳。
8.2
日期与时间
datetime 处理“某天”:格式化、解析、加减、算间隔。
能取当前时间并格式化能解析字符串为日期能算两个日期相差多少天
知识点
三个核心类
- datetime.date 只有年月日;datetime.datetime 带时分秒;timedelta 表示时间差。
- now() 取当前时间,today() 取今天。
- strftime("%Y-%m-%d") 格式化,strptime 反向解析。
格式符
- %Y 四位年、%m 月、%d 日、%H %M %S 时分秒、%A 星期。
- 数据库/表格里常见 "2025-07-01 08:30:00" 这种格式。
时间运算
- date2 - date1 得到 timedelta,.days 取天数。
- date + timedelta(days=7) 得到一周后。
- 不要用字符串直接减,先转 date。
代码示例
▶ 当前时间与格式化
from datetime import datetime
now = datetime.now()
print(now.strftime("%Y-%m-%d %H:%M:%S"))
print(f"{now.year}年{now.month}月{now.day}日")👀 运行结果
(当前时间) 2025年7月1日
▶ 解析与相差天数
from datetime import datetime
d1 = datetime.strptime("2025-01-01", "%Y-%m-%d")
d2 = datetime.strptime("2025-07-01", "%Y-%m-%d")
print((d2 - d1).days, "天")👀 运行结果
181 天
常见错误
⚠️ 踩坑与解决
ValueError: time data '2025/07/01' does not match format
→ 格式串与实际字符串不一致;按实际格式写 %Y/%m/%dTypeError: unsupported operand type(s) for -: 'str' and 'str'
→ 拿字符串直接相减;先 strptime 解析
💡 日期统一用 %Y-%m-%d 存、按需再格式化,能省掉大量跨平台麻烦。
8.3
os、sys、random、math
不装第三方库也能干的活:路径操作、命令行参数、随机数、数学函数。
能用 pathlib/os 处理路径与文件列表能读命令行参数 sys.argv会用 random 与 math 的常用函数
知识点
路径与文件
- pathlib.Path 更现代:p.exists()、p.suffix、p.stem、p.parent。
- p.glob("*.csv") 列出目录下所有 CSV。
- os.path 老写法也常见:join、basename、dirname。
命令行参数
- sys.argv[0] 是脚本名,[1:] 才是参数。
- argv 拿到的是字符串,数字要自己转。
- 参数多时用 argparse,能自动生成帮助信息。
随机与数学
- random.randint(a, b) 闭区间整数;random.choice 从列表取一个;random.shuffle 洗牌。
- random.seed(42) 固定随机结果,方便复现。
- math.sqrt/ceil/floor/pi;round(x, n) 是内置函数不是 math。
代码示例
▶ 遍历目录下的 CSV
from pathlib import Path
for p in Path(".").glob("*.csv"):
print(p.name, p.stat().st_size, "字节")👀 运行结果
(按实际文件输出)
▶ 随机抽奖
import random
random.seed(1)
names = ["张三", "李四", "王五"]
print(random.choice(names), random.randint(1, 100))👀 运行结果
(固定种子下结果可复现)
▶ 命令行参数
import sys
if len(sys.argv) > 1:
n = int(sys.argv[1])
print(f"收到参数 {n}")👀 运行结果
python demo.py 5 → 收到参数 5
常见错误
⚠️ 踩坑与解决
FileNotFoundError 但文件明明在
→ 当前工作目录不是脚本目录;用 Path(__file__).parent 定位IndexError: list index out of range(sys.argv)
→ 没传参数却直接取 argv[1];先判断 len(sys.argv) > 1
💡 脚本要“带参数可配置”:路径、阈值都从 argv 或配置文件读,别写死在代码里。