今天我们要学两个看似不相关、实则都离不开的技能:
正则表达式:在一堆杂乱文本里快速找到你想要的那类信息,像侦探一样。
MySQL:把结构化数据规规矩矩地存起来、查出来,像管家一样。
一个负责“清洗”,一个负责“存储”,都是 AI 数据处理中绕不开的工具。


一、正则表达式:文字的“通缉令”

1. 为什么要学正则?

想象你手上有 1000 页的聊天记录,想找出所有的手机号。
用普通方法:挨个搜 138139150…… 累死,而且还有不同号段。
用正则:写一条规则 “11位数字,第一位是1”,一秒钟全部提取出来。

正则就是一种描述字符串模式的语言。它不是 Python 独有,几乎所有编程语言都支持。

2. 什么时候不需要正则?

如果只是找一句话里有没有 “Python” 这个词,直接用 if "Python" in text: 就行。杀鸡不用牛刀。

3. Python 里怎么用正则?(re 模块)

三步走:

  • 导入 import re

  • 写一个规则(一般用原始字符串 r"..." 避免转义麻烦)

  • 用 re.findall()re.search() 或 re.match() 去查找

三个常用函数的区别(面试常考):

函数 行为 返回
re.match() 从字符串开头匹配 匹配对象或 None
re.search() 扫描整个字符串,返回第一个匹配 匹配对象或 None
re.findall() 扫描整个字符串,返回所有匹配 列表

比喻:

  • match 像保安,只看你进门的第一步是不是 VIP。

  • search 像在图书馆找第一本提到“Python”的书。

  • findall 像把所有提到“Python”的书都找出来。


二、正则规则入门(记住最常用的几个)

1. 匹配单个字符(就像“万能钥匙”)

写法 含义 举例
. 任意一个字符(除了换行) "a.b" 可匹配 "aab""a3b"
\d 一个数字 "身份证号后4位是\d\d\d\d"
\D 一个非数字
\w 字母、数字、下划线、汉字
\s 空白(空格、Tab、换行)
[abc] 只能是 a、b、c 中的一个 "[Pp]ython" 匹配 Python 或 python
[^abc] 除了 a、b、c 的任意一个

2. 匹配多个字符(“数量词”)

写法 含义 举例
* 前一个字符出现 0 次或多次 "wo*" 可匹配 "woo""w"
+ 前一个字符出现 1 次或多次 "wo+" 匹配 "wo""woo",不匹配 "w"
? 前一个字符出现 0 次或 1 次 "https?" 匹配 http 或 https
{m} 恰好 m 次 \d{11} 就是 11 位数字
{m,n} m 到 n 次 \d{3,5} 匹配 3~5 位数字

注意:量词只修饰它前面的一个字符一个括号里的整体。比如 AB{3} 表示 A 后面跟 3 个 B,不是 AB 重复三次。

3. 指定开头和结尾(“边境检查”)

  • ^ 匹配字符串开头

  • $ 匹配字符串结尾

重要场景:校验整个字符串是否符合格式。比如要判断一个字符串是不是合法的手机号,不能只写 \d{11}(这样 "abc13800138000xyz" 也会被提取出手机号,但整体不合法)。
正确写法:^1\d{10}$ —— 从头到尾必须正好是 1 开头 + 10 位数字,多一个字符都不行。

4. 分组 —— 从匹配结果中“拆零件”

用圆括号 () 表示一个分组。比如要提取日期中的年、月、日:

(\d{4})-(\d{2})-(\d{2})
  • 整体 group() 得到 "2025-12-31"

  • group(1) 得到 "2025"

  • group(2) 得到 "12"

  • group(3) 得到 "31"

分组非常有用,比如从日志里提取时间、IP、状态码等。

5. 贪婪与非贪婪(“贪吃蛇 vs 细嚼慢咽”)

默认情况下,* 和 + 是贪婪的:它们会尽量多匹配字符。
比如用 <.*> 去匹配 <title>首页</title>,它会一口气从第一个 < 吃到最后一个 >,结果是整个 "<title>首页</title>",而不是分别拿到 <title> 和 </title>

要改成非贪婪,在 * 或 + 后面加 ?<.*?> 就会匹配最短的:先匹配 <title>,然后下一次再匹配 </title>

记住:非贪婪是“见好就收”。


三、实战:清洗一段“脏”文本(RAG 文档清洗)

假设我们有一段课程问答记录,里面有各种噪声:

第 3 页
【公司机密】不得外传
学生问:怎么用 re.findall?
电话联系:13912345678

页脚:第3页

我们想提取手机号,并删除页码、机密标记、页脚、多余空行。

思路(换一个例子,但原理相同):

  1. 提取手机号:\d{11}

  2. 删除页码:第\s*\d+\s*页

  3. 删除【...】标记:【.*?】

  4. 删除“页脚:”所在行:页脚:.*

  5. 压缩多个换行:\n{2,} 替换成 \n

用 re.sub() 做替换,把匹配到的内容变成空字符串或单个换行。

这样清洗完,剩下的就是干净的问题文本,可以送去做切分和向量化。


四、MySQL:像 Excel 一样管理数据,但更强大

正则处理的是非结构化文本。而很多时候,我们需要存结构化数据,比如商品列表、用户信息、订单记录。这时候就要用数据库

1. 几个核心概念

  • 数据库:一个大的仓库(比如“电商仓库”)。

  • 数据表:仓库里的一个个货架(比如“商品表”、“用户表”)。

  • 字段:货架上的格子(比如“商品名称”、“价格”)。

  • 记录:货架里的一件具体商品。

2. SQL 分类(记住三类即可)

类别 作用 关键字
DDL 定义结构(建库、建表、删表) CREATEDROPALTER
DML 操作数据(增、改、删) INSERTUPDATEDELETE
DQL 查询数据 SELECT

记忆口诀:DDL 动结构,DML 动数据,DQL 查数据

3. 动手做:创建一个“书籍管理”库(不用原笔记的电商例子)

假设我们想存书籍和作者信息。

第一步:建库

CREATE DATABASE book_library DEFAULT CHARSET utf8mb4;
USE book_library;

第二步:建表

作者表(author):

  • id(主键,自动编号)

  • name(作者名,不能为空)

书籍表(book):

  • id(主键)

  • title(书名)

  • price(价格)

  • author_id(关联作者表的 id)

这样设计,避免每本书都把作者名重复存一遍。

第三步:插入数据

INSERT INTO author(name) VALUES ('鲁迅'), ('余华'), ('刘慈欣');

INSERT INTO book(title, price, author_id) VALUES 
('呐喊', 28.00, 1),
('活着', 39.00, 2),
('三体', 68.00, 3),
('朝花夕拾', 25.00, 1);

第四步:修改和删除(务必加 WHERE)

-- 把三体的价格改成 59
UPDATE book SET price = 59.00 WHERE title = '三体';

-- 删除价格低于 30 的书
DELETE FROM book WHERE price < 30;

警告:不写 WHERE 会修改或删除整张表的数据,新手最容易犯的错。


五、查询数据:从简单到复杂

1. 单表查询

  • 查所有:SELECT * FROM book;

  • 只查书名和价格:SELECT title, price FROM book;

  • 加条件:SELECT * FROM book WHERE price > 30;

  • 排序:SELECT * FROM book ORDER BY price DESC;(降序)

  • 聚合统计:SELECT COUNT(*), AVG(price) FROM book;

  • 分组统计:SELECT author_id, COUNT(*) FROM book GROUP BY author_id;

  • 分页:SELECT * FROM book LIMIT 0, 2;(从第0条取2条)

2. 多表查询(重点)

想查“书名 + 作者名”,这两个信息分别在 book 表和 author 表里,需要连接

内连接(INNER JOIN):只返回两边都能匹配上的记录。

SELECT b.title, a.name 
FROM book b
INNER JOIN author a ON b.author_id = a.id;

结果会显示每本书及其作者名。如果某本书的 author_id 不存在于 author 表,那本书就不会出现。

左连接(LEFT JOIN):保留左表(book)的所有记录,右表(author)匹配不到的地方填 NULL。

SELECT b.title, a.name 
FROM book b
LEFT JOIN author a ON b.author_id = a.id;

子查询:先查一个结果,再作为条件。

比如:查询价格高于平均价格的书。

SELECT * FROM book 
WHERE price > (SELECT AVG(price) FROM book);

括号里的子查询先算出平均价,外层再用它筛选。


六、正则与 MySQL 的实际应用(AI 方向)

  • RAG 文档清洗:用正则去掉页眉页脚、特殊标记、多余空白,让文档分块更干净。

  • 日志分析:用正则从服务器日志提取 IP、时间、错误码,存入 MySQL 做统计。

  • 数据校验:前端传过来的手机号、邮箱,后端用正则校验格式,再存入数据库。

  • 全文搜索:MySQL 也支持简单的正则匹配(REGEXP),但大数据量一般会转用 Elasticsearch。


七、总结

  • 正则是一个“模式描述”工具,用于匹配、提取、替换一类字符串。

  • 记住常用规则:\d\w\s.*+?{m}^$().*?

  • re.match vs re.search vs re.findall 的区别。

  • MySQL 的 DDL、DML、DQL 三大类 SQL。

  • 单表查询:SELECTWHEREORDER BYGROUP BYLIMIT

  • 多表查询:内连接、左连接、子查询。

  • UPDATE 和 DELETE 必须带 WHERE,否则整张表遭殃。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐