Python 生成器 + 正则表达式 超详细完整版
一、前言
今天学习两个Python 高级核心技能:
- 生成器(Generator):节省内存、高效迭代
- 正则表达式(RegExp):字符串匹配、提取、替换神器
学会它们,你能处理:
- 大数据量迭代(不卡内存)
- 手机号/邮箱/身份证提取
- 日志清洗、爬虫数据解析
- 企业级开发高频用法
二、生成器(Generator)
1. 什么是生成器?
- 一边循环一边计算的机制
- 不一次性生成所有数据
- 极度节省内存
一句话:
需要一个数据,就生成一个,不占满内存。
2. 生成器两种写法
写法1:小括号推导式(最简单)
# 列表推导式(占内存)
a = [x for x in range(100000)]
# 生成器表达式(不占内存)
g = (x for x in range(100000))
写法2:yield 关键字(重点)
函数中出现 yield → 自动变成生成器
def gen():
yield 1
yield 2
yield 3
g = gen()
3. 怎么获取生成器数据?
方法1:next()
print(next(g)) # 1
print(next(g)) # 2
print(next(g)) # 3
方法2:for 循环(最常用)
for i in gen():
print(i)
4. yield 执行流程(重点)
- 调用
next()→ 执行到yield暂停 - 返回
yield后面的值 - 再次调用 → 从暂停处继续执行
- 直到函数结束
5. 生成器经典案例:斐波那契数列
def fib(n):
a, b = 0, 1
for _ in range(n):
yield b
a, b = b, a + b
# 取前10项
for num in fib(10):
print(num)
6. 生成器优点
- 内存占用极小
- 适合处理海量数据
- 惰性计算(用到才算)
- 迭代效率高
7. 生成器总结
(x for x in ...)→ 生成器- 函数 +
yield→ 生成器 next()/for取值- 节省内存 = 生成器最大意义
三、正则表达式(RegExp)
1. 什么是正则?
- 用来匹配/查找/提取/替换字符串的规则
- 通用语言:Java/JS/Python/Go 都能用
- 处理文本最强大工具
2. Python 使用正则模块
import re
3. 正则四大常用方法(必背)
| 方法 | 作用 |
|---|---|
re.findall() |
查找所有匹配结果,返回列表 |
re.search() |
查找第一个匹配,返回匹配对象 |
re.match() |
从开头匹配 |
re.sub() |
替换字符串 |
四、正则元字符(最核心)
1. 常用匹配规则
| 符号 | 含义 |
|---|---|
. |
匹配任意字符(除换行) |
\d |
匹配数字(0-9) |
\D |
匹配非数字 |
\w |
匹配字母/数字/下划线 |
\W |
匹配非单词字符 |
\s |
匹配空白(空格/换行) |
^ |
匹配字符串开头 |
| ` | 符号 |
| --- | --- |
. |
匹配任意字符(除换行) |
\d |
匹配数字(0-9) |
\D |
匹配非数字 |
\w |
匹配字母/数字/下划线 |
\W |
匹配非单词字符 |
\s |
匹配空白(空格/换行) |
^ |
匹配字符串开头 |
| 匹配字符串结尾 |
2. 量词(控制匹配次数)
| 符号 | 含义 |
|---|---|
* |
0次或多次 |
+ |
1次或多次 |
? |
0次或1次 |
{n} |
exactly n 次 |
{n,m} |
n~m 次 |
3. 贪婪与非贪婪
- 贪婪:默认,尽可能多匹配
- 非贪婪:加
?,尽可能少匹配
# 贪婪
re.findall(r'a.*b', 'a123b456b') # ['a123b456b']
# 非贪婪
re.findall(r'a.*?b', 'a123b456b') # ['a123b']
五、正则经典案例(作业/开发高频)
案例1:提取所有数字
import re
s = "python123hello456"
res = re.findall(r"\d+", s)
print(res) # ['123','456']
案例2:匹配手机号
phone = "13812345678"
res = re.match(r"^1[3-9]\d{9}$", phone)
if res:
print("手机号合法")
案例3:匹配邮箱
email = "test@163.com"
res = re.match(r"\w+@\w+\.\w+", email)
案例4:替换字符串
s = "hello123world456"
# 把数字替换成 *
res = re.sub(r"\d+", "*", s)
print(res) # hello*world*
案例5:爬虫常用——提取标签内容
html = "<div>hello</div><span>python</span>"
res = re.findall(r"<.*?>(.*?)</.*?>", html)
print(res) # ['hello','python']
六、分组(Group)高级用法
s = "name:张三,age:18"
res = re.search(r"name:(.*?),age:(.*)", s)
print(res.group(1)) # 张三
print(res.group(2)) # 18
七、生成器 + 正则 综合小案例
import re
# 生成器:逐行读取大文件
def read_file(file):
with open(file, 'r', encoding='utf-8') as f:
for line in f:
yield line.strip()
# 提取文件中所有手机号
for line in read_file("data.txt"):
phones = re.findall(r"1[3-9]\d{9}", line)
if phones:
print(phones)
优点:内存极低,可处理几GB大文件
八、 重点总结
生成器
- 生成器 = 惰性迭代、节省内存
- 两种写法:
(x for x in ...)、yield yield暂停函数,next()继续执行- 适合处理海量数据/大文件
正则表达式
- 模块:
import re - 常用方法:
findall、search、sub - 核心:
\d、\w、.、+、*、? - 经典场景:手机号、邮箱、提取数据、文本替换
一句话总结
生成器让内存更高效,正则让字符串处理更强大!

浙公网安备 33010602011771号