AI大模型学习06:正则表达式和mysql
今天我们要学两个看似不相关、实则都离不开的技能:
正则表达式:在一堆杂乱文本里快速找到你想要的那类信息,像侦探一样。
MySQL:把结构化数据规规矩矩地存起来、查出来,像管家一样。
一个负责“清洗”,一个负责“存储”,都是 AI 数据处理中绕不开的工具。
一、正则表达式:文字的“通缉令”
1. 为什么要学正则?
想象你手上有 1000 页的聊天记录,想找出所有的手机号。
用普通方法:挨个搜 138、139、150…… 累死,而且还有不同号段。
用正则:写一条规则 “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页
我们想提取手机号,并删除页码、机密标记、页脚、多余空行。
思路(换一个例子,但原理相同):
-
提取手机号:
\d{11} -
删除页码:
第\s*\d+\s*页 -
删除【...】标记:
【.*?】 -
删除“页脚:”所在行:
页脚:.* -
压缩多个换行:
\n{2,}替换成\n
用 re.sub() 做替换,把匹配到的内容变成空字符串或单个换行。
这样清洗完,剩下的就是干净的问题文本,可以送去做切分和向量化。
四、MySQL:像 Excel 一样管理数据,但更强大
正则处理的是非结构化文本。而很多时候,我们需要存结构化数据,比如商品列表、用户信息、订单记录。这时候就要用数据库。
1. 几个核心概念
-
数据库:一个大的仓库(比如“电商仓库”)。
-
数据表:仓库里的一个个货架(比如“商品表”、“用户表”)。
-
字段:货架上的格子(比如“商品名称”、“价格”)。
-
记录:货架里的一件具体商品。
2. SQL 分类(记住三类即可)
| 类别 | 作用 | 关键字 |
|---|---|---|
| DDL | 定义结构(建库、建表、删表) | CREATE、DROP、ALTER |
| DML | 操作数据(增、改、删) | INSERT、UPDATE、DELETE |
| 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.matchvsre.searchvsre.findall的区别。 -
MySQL 的 DDL、DML、DQL 三大类 SQL。
-
单表查询:
SELECT、WHERE、ORDER BY、GROUP BY、LIMIT。 -
多表查询:内连接、左连接、子查询。
-
UPDATE和DELETE必须带WHERE,否则整张表遭殃。
更多推荐




所有评论(0)