Python 生成器 + 正则表达式 超详细完整版

一、前言

今天学习两个Python 高级核心技能:

  1. 生成器(Generator):节省内存、高效迭代
  2. 正则表达式(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 执行流程(重点)

  1. 调用 next() → 执行到 yield 暂停
  2. 返回 yield 后面的值
  3. 再次调用 → 从暂停处继续执行
  4. 直到函数结束

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大文件


八、 重点总结

生成器

  1. 生成器 = 惰性迭代、节省内存
  2. 两种写法:(x for x in ...)、yield
  3. yield 暂停函数,next() 继续执行
  4. 适合处理海量数据/大文件

正则表达式

  1. 模块:import re
  2. 常用方法:findall、search、sub
  3. 核心:\d、\w、.、+、*、?
  4. 经典场景:手机号、邮箱、提取数据、文本替换

一句话总结

生成器让内存更高效,正则让字符串处理更强大!

posted @ 2026-04-06 08:40  Petula  阅读(57)  评论(0)    收藏  举报