Python re模块的使用全过程

 更新时间:2025年04月14日 14:58:02   作者:Yant224  
这篇文章主要介绍了Python re模块的使用全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、模块简介

re 模块是 Python 标准库中处理正则表达式的核心工具,提供强大的文本模式匹配、搜索和替换功能。通过特定的语法规则,可以快速完成以下任务:

  • 数据验证(邮箱/手机号格式校验)
  • 文本内容提取(日志分析/网页爬虫)
  • 批量文本处理(格式转换/敏感词过滤)
  • 复杂字符串操作(多条件分割/模板替换)

正则表达式引擎基于 PCRE(Perl Compatible Regular Expressions)实现

二、核心功能

  • 函数介绍:
函数名称匹配范围返回类型适用场景性能特点
re.match仅字符串开头Match/None格式校验快速失败
re.search全局首次匹配Match/None内容提取中等性能
re.findall所有非重叠匹配list批量数据收集内存消耗高
re.finditer所有非重叠匹配iterator大文本处理内存友好
re.split分割字符串list复杂分隔符处理替代str.split
re.compile-Pattern对象高频正则表达式复用提升30%性能

三. 功能详解

1. re.match(pattern, string, flags=0)

特点

  • 仅匹配字符串开头,如果不是起始位置匹配成功的话,match() 就返回 None
  • 相当于自动添加^锚点

参数说明

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志

返回值

  • 成功:re.Match对象,使用 group(num)groups() 匹配对象函数来获取匹配表达式
  • 失败:None
匹配对象方法描述
group(num=0)匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
  • 使用案例
# 验证字符串是否以数字开头,调用这个方法等同于 r'^\d+'
# 如果匹配的字符串是c123abc,是匹配不到的
if re.match(r'\d+', '123abc'):
    print("Valid header")
else:
    print("Invalid header")

# 提取开头的版本号
version = re.match(r'v?(\d+\.\d+)', 'v3.8.1').group(1)  # '3.8'

2. re.search(pattern, string, flags=0)

特点

  • 扫描整个字符串寻找第一个匹配
  • 支持复杂定位逻辑

参数与返回:同re.match

使用案例

# 查找第一个有效数字串,只匹配第一个
text = "Total: 1500 items, price $299"
match = re.search(r'\d+', text)
if match:
    print(f"价格:{match.group()}")  # 1500

# 带条件的搜索
pattern = r'(?<=ID:)\s*[A-Z0-9]{8}'  # 查找ID后的8位编码
id_code = re.search(pattern, "User ID: AB3XK9P2").group()  # AB3XK9P2

3. re.compile(pattern, flags=0)

特点

  • 预编译正则表达式,生成一个正则表达式( Pattern )对象
  • 适合高频调用场景

参数说明

  • pattern : 一个字符串形式的正则表达式
  • flags 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
    • re.IGNORECASEre.I - 使匹配对大小写不敏感
    • re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
    • re.MULTILINEre.M - 多行模式,改变 ^$ 的行为,使它们匹配字符串的每一行的开头和结尾。
    • re.DOTALLre.S - 使 . 匹配包括换行符在内的任意字符。
    • re.ASCII - 使 \w, \W, \b, \B, \d, \D, \s, \S 仅匹配 ASCII 字符。
    • re.VERBOSEre.X - 忽略空格和注释,可以更清晰地组织复杂的正则表达式。

这些标志可以单独使用,也可以通过按位或(|)组合使用。例如,re.IGNORECASE | re.MULTILINE 表示同时启用忽略大小写和多行模式。

返回re.Pattern对象

使用案例

# 预编译邮箱验证正则
email_re = re.compile(
    r'''(
        [\w\.-]+          # 用户名
        @ 
        [\w\.-]+          # 域名
        \.
        [a-zA-Z]{2,4}     # 顶级域名
    )''', re.VERBOSE)

# 复用编译对象
valid = email_re.match('user@example.com') is not None  # True

案例调用match匹配成功时返回一个 Match 对象,其中:

  • group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group()group(0)
  • start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0
  • end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0
  • span([group]) 方法返回 (start(group), end(group))

4. re.findall(pattern, string, flags=0)

特点:在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。

^注意: match 和 search 是匹配一次 findall 匹配所有。

参数说明

  • pattern 匹配模式。
  • string 待匹配的字符串。
  • pos 可选参数,指定字符串的起始位置,默认为 0。
  • endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。

返回值

  • 无分组:匹配字符串列表 [‘a’, ‘b’, …]
  • 有分组:分组元组列表 [(‘a’, ‘1’), …]

使用案例

# 提取所有数字
numbers = re.findall(r'\d+', 'A1B23C456')
print(numbers)  # ['1','23','456']

# 分组提取日期成分
dates = re.findall(r'(\d{4})-(\d{2})-(\d{2})', '2023-08-01, 2025-03-15')
print(dates)  # [('2023','08','01'), ('2025', '03', '15')]

5. re.finditer(pattern, string, flags=0)

特点

  • 和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回
  • 处理大文本时内存更高效
参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志
  • 返回值callable_iterator对象
  • 使用案例
# 处理100MB日志文件
with open('server.log') as f:
    for match in re.finditer(r'$$(ERROR|WARN)$$.*?(req_id=\w+)', f.read()):
        level = match.group(1)
        req_id = match.group(2)
        print(f"{level}报警:{req_id}")

6. re.split(pattern, string, maxsplit=0, flags=0)

特点

  • split 方法按照能够匹配的子串将字符串分割后返回列表
  • 保留分割符内容(使用分组时)

参数说明

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
maxsplit分割次数,maxsplit=1 分割一次,默认为 0,不限制次数。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志
  • 使用案例
# 复杂分隔符分割
text = "apple, banana;cherry|orange"
parts = re.split(r'[,;|]\s*', text)  # ['apple','banana','cherry','orange']

# 带保留分隔符的分割
re.split(r'([,;])', 'a,b;c')  # ['a', ',', 'b', ';', 'c']

# 控制分割次数
re.split(r'\d+', 'a1b22c333d', maxsplit=2)  # ['a','b','c333d']

四、综合应用案例

日志分析系统

log_pattern = re.compile(r'''
    (?P<time>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})  # 时间
    \s\|\s
    (?P<level>INFO|ERROR|WARN)                      # 日志级别
    \s\|\s
    (?P<module>\w+)\.py                             # 模块
    :(?P<line>\d+)                                  # 行号
    \s-\s
    (?P<msg>.+)                                     # 消息
''', re.VERBOSE)

for log in open('app.log'):
    if (match := log_pattern.search(log)):
        print(f"{match.group('time')} [{match.group('level')}]", 
              f"{match.group('module')}:{match.group('line')}",
              match.group('msg'))

五、正则表达式修饰符 - 可选标志

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。

以下标志可以单独使用,也可以通过按位或(|)组合使用。

例如:re.IGNORECASE | re.MULTILINE 表示同时启用忽略大小写和多行模式。

最佳实践建议

  1. ​优先使用编译对象:当正则使用超过3次时
  2. ​合理使用分组:避免过多捕获组影响性能
  3. ​注意贪婪匹配:非贪婪模式.*?可避免意外匹配
  4. ​处理特殊字符:用re.escape()处理动态输入
  5. 控制回溯次数:复杂正则可能引发性能问题

完整API文档:Python re模块官方文档

模块功能说明
用户管理1. 注册登录2. 权限控制3. 资料修改
订单系统
  • 创建订单
  • 支付处理
  • 物流跟踪

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python绘制地理图表可视化神器pyecharts

    Python绘制地理图表可视化神器pyecharts

    这篇文章主要介绍了Python绘制地理图表可视化神器pyecharts,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • Python Socket 编程知识点详细介绍

    Python Socket 编程知识点详细介绍

    这篇文章主要介绍了Python Socket 编程,Socket又称为套接字,它是所有网络通信的基础。网络通信其实就是进程间的通信,Socket主要是使用IP地址,协议,端口号来标识一个进程,下文详细内容,需要的小伙伴可以参考一下
    2022-02-02
  • Python基于DeepSeek大模型的提示词优化方案

    Python基于DeepSeek大模型的提示词优化方案

    以下基于DeepSeek大模型特性及搜索结果的综合分析,结合提示词设计原则、技术原理与优化策略,提供完整Python代码案例及详细解析,需要的朋友可以参考下
    2025-04-04
  • Pycharm如何返回上一次编辑处的快捷键

    Pycharm如何返回上一次编辑处的快捷键

    这篇文章主要介绍了Pycharm如何返回上一次编辑处的快捷键问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Django实现图片文字同时提交的方法

    Django实现图片文字同时提交的方法

    这篇文章主要介绍了Django实现图片文字同时提交的方法,较为详细的分析了Django+jQuery实现图片与文字同时提交的相关技巧,需要的朋友可以参考下
    2015-05-05
  • 利用Python开发实现简单的记事本

    利用Python开发实现简单的记事本

    最近想对python加深学习一下,同时也是想试着做一些东西,所以使用python,结合Tkinter来做一个简单的跨平台记事本。最终实现的记事本如下,也算是麻雀虽小,五脏俱全了,之后也是会继续完善的。文中通过图文及示例代码介绍的很详细,有需要的朋友们可以参考借鉴。
    2016-11-11
  • Python使用pyautogui模块实现自动化鼠标和键盘操作示例

    Python使用pyautogui模块实现自动化鼠标和键盘操作示例

    这篇文章主要介绍了Python使用pyautogui模块实现自动化鼠标和键盘操作,简单描述了pyautogui模块的功能,并结合实例形式较为详细的分析了Python使用pyautogui模块实现鼠标与键盘自动化操作相关技巧,需要的朋友可以参考下
    2018-09-09
  • Python合并同一个文件夹下所有PDF文件的方法

    Python合并同一个文件夹下所有PDF文件的方法

    今天小编就为大家分享一篇关于Python合并同一个文件夹下所有PDF文件的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Python中re.findall()用法详解

    Python中re.findall()用法详解

    本文主要介绍了Python中re.findall()用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 如何用Python编写一个电子考勤系统

    如何用Python编写一个电子考勤系统

    这篇文章主要介绍了用Python编写一个电子考勤系统,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02

最新评论