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%性能
  • 正则表达式可以包含一些可选标志修饰符来控制匹配的模式。 以下标志可以单独使用,也可以通过按位或(|)组合使用。 例如:re.IGNORECASE | re.MULTILINE 表示同时启用忽略大小写和多行模式。
  • 以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。 您可能感兴趣的文章: python如何利用re模块正则表达式匹配ip地址 Python中re模块下的函数详解 Python中的re模块之正则表达式模块常用方法 python正则表达式re模块的使用示例详解 关于Python正则表达式模块之re模块 最新python正则表达式(re模块)详解
  • 目录
    • 一、模块简介
    • 二、核心功能
    • 三. 功能详解
      • 1. re.match(pattern, string, flags=0)
      • 2. re.search(pattern, string, flags=0)
      • 3. re.compile(pattern, flags=0)
      • 4. re.findall(pattern, string, flags=0)
      • 5. re.finditer(pattern, string, flags=0)
      • 6. re.split(pattern, string, maxsplit=0, flags=0)
    • 四、综合应用案例
      • 日志分析系统
    • 五、正则表达式修饰符 – 可选标志
      • 最佳实践建议
    • 总结

      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%性能

      特点

      • 仅匹配字符串开头,如果不是起始位置匹配成功的话,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'

      特点

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

      参数与返回:同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
      

      特点

      • 预编译正则表达式,生成一个正则表达式( 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))

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

      ^注意: 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')]

      特点

      • 和 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}")

      特点

      • 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}sd{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如何利用re模块正则表达式匹配ip地址
      • Python中re模块下的函数详解
      • Python中的re模块之正则表达式模块常用方法
      • python正则表达式re模块的使用示例详解
      • 关于Python正则表达式模块之re模块
      • 最新python正则表达式(re模块)详解

      站内搜索