Python re模块

Python re模块知识点汇总

Python re模块知识点汇总

正则表达式保姆级教程 – 编程小白也能轻松学会文本处理

正则表达式就像是文本处理的”瑞士军刀”,能让你在文本大海中快速找到想要的”小鱼”!

Python的re模块提供了正则表达式的所有功能,下面用大白话带你全面掌握!

1. 什么是正则表达式?

正则表达式(Regular Expression)是一种强大的文本匹配工具,可以理解为:

  • 🔍 高级查找工具:在一大段文字中快速找到特定模式的文本
  • 📝 文本模板:定义你要查找的文本长什么样
  • 🛠️ 处理利器:查找、替换、分割文本的高级工具

为什么学习re模块?

  • 处理日志文件提取关键信息
  • 验证用户输入的格式(邮箱、电话等)
  • 从HTML/文本中提取数据
  • 批量修改文档内容
  • 比普通字符串方法更强大的文本处理能力

💡 简单理解:普通字符串方法只能找固定文本(如”abc”),正则表达式能找变化模式(如”所有以a开头、c结尾的3字母单词”)

2. re模块核心函数

① re.search() – 大海捞针

  • 整个字符串中搜索匹配模式
  • 找到第一个匹配就返回
  • 返回Match对象(包含匹配信息),没找到返回None
import re
text = “电话:123-4567, 备用:890-1234”
match = re.search(r’\d{3}-\d{4}’, text)
# 找到第一个电话号码:123-4567

② re.match() – 守门员检查

  • 只检查字符串开头是否匹配
  • 开头不匹配直接返回None
text = “姓名: 张三”
re.match(r’姓名’, text) # 匹配成功
re.match(r’张三’, text) # 开头不是”张三”,匹配失败

③ re.findall() – 全搜索小能手

  • 找出字符串中所有匹配项
  • 返回字符串列表
text = “苹果¥5, 香蕉¥3, 橙子¥4”
prices = re.findall(r’¥(\d+)’, text)
# 返回 [‘5’, ‘3’, ‘4’]

④ re.finditer() – 高级版findall

  • 和findall一样找所有匹配项
  • 返回Match对象迭代器(可以获取更多匹配信息)

⑤ re.sub() – 文本替换神器

  • 查找并替换匹配的文本
text = “今天是2023-08-15”
new_text = re.sub(r'(\d{4})-(\d{2})-(\d{2})’, r’\2/\3/\1′, text)
# 替换为 “今天是08/15/2023”

⑥ re.split() – 智能切割机

  • 用正则表达式作为分隔符切割字符串
  • 比str.split()更灵活的分割方式
3. 正则表达式语法手册

常用元字符(特殊符号)

  • . – 匹配任意单个字符(换行符除外)
  • \w – 匹配字母、数字、下划线(等价于[a-zA-Z0-9_])
  • \d – 匹配数字(等价于[0-9])
  • \s – 匹配空白字符(空格、制表符等)
  • ^ – 匹配字符串的开头
  • $ – 匹配字符串的结尾

数量词(匹配多少次)

  • * – 匹配0次或多次
  • + – 匹配1次或多次
  • ? – 匹配0次或1次
  • {n} – 匹配恰好n次
  • {n,} – 匹配至少n次
  • {n,m} – 匹配n到m次

字符类(匹配其中之一)

[abc] # 匹配a、b或c
[a-z] # 匹配任意小写字母
[^0-9] # 匹配非数字字符(^在[]内表示”排除”)

分组捕获(提取关键部分)

  • ( ) – 分组并捕获匹配内容
  • (?: ) – 分组但不捕获(提高性能)
text = “张伟 1990年出生”
match = re.search(r'(\w+)\s(\d{4})’, text)
# match.group(1) → “张伟”
# match.group(2) → “1990”

或操作符

  • | – 匹配左边或右边的内容
re.search(r’苹果|香蕉’, “我喜欢香蕉”) # 匹配”香蕉”

📌 正则表达式中反斜杠\是转义字符,所以写\d时Python中要写成r'\d''\\d'

4. 高级技巧与性能优化

re.compile() – 预编译加速器

  • 把正则表达式先”编译”好,重复使用提高效率
  • 适用于需要多次使用同一模式的场景
pattern = re.compile(r’\d{3}-\d{4}’) # 先编译

# 多次使用
result1 = pattern.search(text1)
result2 = pattern.findall(text2)

匹配标志(Flags)

  • re.IGNORECASE / re.I – 忽略大小写
  • re.MULTILINE / re.M – 多行模式(影响^和$)
  • re.DOTALL / re.S – 让.匹配包括换行符的所有字符
re.findall(r’^hello’, ‘Hello\nhello’, re.I | re.M)
# 匹配两个hello(忽略大小写+多行模式)

贪婪 vs 非贪婪匹配

  • 贪婪模式(默认):尽可能匹配更长的字符串
  • 非贪婪模式:在量词后加?,匹配尽量短的字符串
text = “<div>内容</div>”

# 贪婪模式(默认)
re.search(r'<.*>’, text) # 匹配整个字符串

# 非贪婪模式
re.search(r'<.*?>’, text) # 只匹配<div>

Match对象详解

  • .group() – 返回整个匹配文本
  • .group(n) – 返回第n个分组的匹配
  • .start() / .end() – 匹配的起止位置
  • .span() – 返回(start, end)元组

⚠️ 警告:避免过度复杂的正则表达式

过于复杂的正则可能导致性能问题(如灾难性回溯)。对于复杂的文本解析,考虑结合其他解析方法。

5. 实际应用案例

案例1:验证电子邮箱格式

email_pattern = r’^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$’
def is_valid_email(email):
    return re.match(email_pattern, email) is not None

案例2:提取网页中的所有链接

html = ‘<a href=”https://example.com”>链接</a>’
links = re.findall(r’href=[“\’](.*?)[“\’]’, html)
# 返回 [‘https://example.com’]

案例3:日志文件分析

log = “2023-08-15 12:30:45 [INFO] User login”
pattern = r'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) $$(\w+)$$ (.+)’
match = re.match(pattern, log)
# 分组提取:日期、时间、日志级别、消息内容

案例4:电话号码格式化

phone = “客服电话:400-123-4567”
formatted = re.sub(r'(\d{3})-(\d{3})-(\d{4})’, r'(\1) \2-\3′, phone)
# 结果: “客服电话:(400) 123-4567”
6. 学习路径与资源推荐

正则表达式学习路线

  1. 掌握基础元字符 (. \d \w \s ^ $)
  2. 学习量词使用 (* + ? {})
  3. 理解字符类 ([]) 和分组 (())
  4. 练习常用场景(邮箱、电话、URL匹配)
  5. 掌握贪婪/非贪婪模式
  6. 学习使用re.compile()提高性能
  7. 处理更复杂的文本提取任务

练习建议

  • 使用在线测试工具(如regex101.com)实时调试
  • 从简单模式开始,逐步增加复杂度
  • 多看多练常见正则表达式案例
  • 实际项目中应用而不仅仅是练习

推荐学习资源

  • Python官方文档:re模块
  • 《Python Cookbook》正则表达式章节
  • RegexOne互动教程
  • 正则表达式可视化工具:regexper.com

💎 终极秘诀:正则表达式就像学外语 – 多练多用才能掌握!遇到复杂任务时,拆分成多个简单正则往往比写一个巨型正则更有效。

正则表达式是文本处理的瑞士军刀 • 掌握re模块是Python程序员的必备技能

从今天开始练习,30天后你会惊叹自己的文本处理能力!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部