Python3 正则表达式(Regular Expressions)

Python3 正则表达式(Regular Expressions)


🎯 学习目标

掌握 Python 中正则表达式模块 re 的使用方法,能够在字符串匹配、提取、替换等常见场景中灵活应用。结合实际项目案例理解正则的语法结构与应用场景,并能利用 PyCharm 高效调试正则表达式。


🔑 核心重点

分类 内容
模块名 re
主要功能 字符串匹配、查找、替换、分组、贪婪/非贪婪模式等
应用场景 数据清洗、日志分析、表单验证、爬虫数据提取
推荐工具 使用在线测试工具(如 regex101.com)辅助编写
实战建议 结合 re.compile() 提高性能,避免重复编译正则表达式

📚 详细讲解

一、什么是正则表达式?

正则表达式(Regular Expression) 是一种用于描述字符串模式的强大工具,可以用来:

  • 判断一个字符串是否符合某种格式(如邮箱、电话号码)
  • 提取字符串中的特定部分(如 URL 中的参数)
  • 替换或删除某些内容(如敏感词过滤)

在 Python 中,我们通过内置模块 re 来实现正则表达式的操作。


二、常用函数(方法)

方法 功能说明 示例
re.match() 从字符串开头开始匹配,只返回第一个 re.match(r'\d+', '123abc')
re.search() 扫描整个字符串,返回第一个匹配项 re.search(r'cat', 'The cat is cute')
re.findall() 返回所有匹配项列表 re.findall(r'\d+', 'a12b34c56')
re.finditer() 返回迭代器,每个元素是匹配对象 可遍历获取多个匹配结果
re.sub() 替换匹配的内容 re.sub(r'old', 'new', text)
re.split() 按匹配内容分割字符串 re.split(r'\d+', 'a1b2c3')
re.compile() 编译正则表达式,提升多次使用的效率 pattern = re.compile(r'\d+')

三、基础语法符号

符号 含义 示例
\d 数字 [0-9] r'\d{3}' 匹配三位数字
\D 非数字 r'\D+' 匹配连续非数字字符
\w 单词字符 [a-zA-Z0-9_] r'\w+' 匹配单词
\W 非单词字符
\s 空白字符(空格、换行等) r'\s+' 匹配任意空白
\S 非空白字符
. 任意字符(除换行) r'.*' 匹配任意字符
^ 开始位置 r'^abc' 匹配以 abc 开头
` 符号 含义
-------- ------------------------ ------------------------------
\d 数字 [0-9] r'\d{3}' 匹配三位数字
\D 非数字 r'\D+' 匹配连续非数字字符
\w 单词字符 [a-zA-Z0-9_] r'\w+' 匹配单词
\W 非单词字符
\s 空白字符(空格、换行等) r'\s+' 匹配任意空白
\S 非空白字符
. 任意字符(除换行) r'.*' 匹配任意字符
^ 开始位置 r'^abc' 匹配以 abc 开头
  \| 结束位置                 \| `r'end$'` 匹配以 end 结尾      |

| * | 0 次或多次 | r'a*' 匹配 a 出现 0 或多次 |
| + | 至少一次 | r'a+' 匹配至少一个 a |
| ? | 0 次或 1 次 | r'a?' 匹配 a 出现 0 或 1 次 |
| {n} | 精确 n 次 | r'a{3}' 匹配 aaa |
| {n, m} | n 到 m 次 | r'\d{1,3}' 匹配 1~3 位数字 |
| [] | 字符集合 | r'[aeiou]' 匹配元音字母 |
| () | 分组捕获 | r'(\d{3})-(\d{4})' |
| | | 或 | r'red|blue' 匹配 red 或 blue |


四、实战示例

✅ 示例 1:匹配手机号码(中国大陆)

import re

text = "我的电话是 13812345678,请联系我。"
pattern = r'1[3-9]\d{9}'

match = re.search(pattern, text)
if match:
    print("找到手机号:", match.group())

📌 输出:

找到手机号: 13812345678

✅ 示例 2:提取网页链接

import re

html = '''
<a href="https://example.com">主页</a>
<a href="http://test.org">测试网站</a>
'''

urls = re.findall(r'https?://[^\s"]+', html)
print(urls)

📌 输出:

['https://example.com', 'http://test.org']

✅ 示例 3:替换敏感词为 ****

import re

text = "这个电影真垃圾,太烂了!"
bad_words = ["垃圾", "烂"]

# 构建正则模式:(垃圾|烂)
pattern = re.compile(r'|'.join(map(re.escape, bad_words)))

cleaned = pattern.sub('****', text)
print(cleaned)

📌 输出:

这个电影真****,太****了!

✅ 示例 4:使用分组提取日期信息

import re

log_line = "ERROR: 2025-04-05 14:30:00 - Something went wrong"
pattern = r'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})'

match = re.search(pattern, log_line)
if match:
    date_str, time_str = match.groups()
    print(f"日期: {date_str}, 时间: {time_str}")

📌 输出:

日期: 2025-04-05, 时间: 14:30:00

⚠️ 注意事项

  • re.match() 仅从字符串开头开始匹配,若需全文搜索请使用 re.search()
  • 特殊字符如 .?* 等在正则中有特殊含义,需转义时加 \(如 \.com
  • 使用 re.compile() 提升多次匹配的性能
  • 分组 ( ) 和非捕获 (?: ) 要区分清楚,避免不必要的捕获
  • 正则表达式默认是“贪婪”匹配,可使用 ? 改为“非贪婪”
  • 在 PyCharm 中调试正则时,可使用“Find in Path”功能测试正则表达式

🧪 实际案例分析

📌 场景:日志文件分析工具

功能需求:

  • 读取日志文件,提取每行的时间戳、日志等级、消息
  • 统计各等级日志数量(INFO/WARNING/ERROR)

示例代码:

import re
from collections import defaultdict

def analyze_log(file_path):
    pattern = re.compile(r'(?P<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - (?P<level>\w+) - (?P<message>.*)')
    
    counts = defaultdict(int)

    with open(file_path, 'r', encoding='utf-8') as f:
        for line in f:
            match = pattern.match(line.strip())
            if match:
                level = match.group('level')
                counts[level] += 1
    
    for level, count in counts.items():
        print(f"{level}: {count}")

# 假设有一个 logs.txt 文件,格式如下:
# 2025-04-05 14:30:00 - INFO - User logged in
# 2025-04-05 14:31:00 - ERROR - Database connection failed

📌 说明:

  • 使用命名分组捕获时间戳、等级、消息
  • 使用 defaultdict 统计出现次数
  • 可扩展为自动报警系统,当 ERROR 达到一定数量时触发通知

🧩 拓展练习(动手实践)

  1. 编写程序提取一段文本中的所有电子邮件地址。
  2. 编写一个函数判断输入的字符串是否是一个合法的 IP 地址(IPv4)。
  3. 编写脚本将一段中文文本中的标点符号全部去除。
  4. 编写程序提取 HTML 文本中的所有 <img> 标签,并提取 src 属性值。
  5. 编写一个身份证号码解析器,提取出生年月日、性别、地区编码等信息。

🧭 下一步建议

  • 下一章学习内容:《Python3 异常处理机制》
  • 掌握异常捕获、自定义异常类、finally 与 else 的使用
  • 学会在文件操作、网络请求等场景中合理使用异常处理
  • 理解断言(assert)和上下文管理器(with)的作用

如果你希望我为你提供:

  • Python 正则表达式速查表 PDF(含符号解释 + 示例)
  • 更多实战项目练习题(如爬虫提取、日志分析、配置文件解析等)
  • 视频教学资源推荐(中文讲解)
  • 如何结合 PyCharm 快捷键快速测试正则表达式

欢迎随时告诉我 😊

posted @ 2025-06-03 08:24  红尘过客2022  阅读(97)  评论(0)    收藏  举报