Python re库(正则表达式库)的详细指南

1. 模块概述

re 是 Python 标准库中用于正则表达式操作的模块,提供字符串的复杂模式匹配、搜索、替换等功能。正则表达式(Regex)通过特定语法规则描述字符串模式,适用于文本解析、数据清洗、输入验证等场景。

2. 核心概念

​**(1) 正则表达式语法**
  • 普通字符:如 a1 直接匹配自身。
  • 特殊字符
  • .:匹配任意字符(除换行符,除非启用 re.DOTALL)。
  • ^:匹配字符串开头。
  • $:匹配字符串结尾。
  • \d:匹配数字(等价于 [0-9])。
  • \w:匹配字母、数字、下划线(等价于 [a-zA-Z0-9_])。
  • \s:匹配空白符(空格、制表符、换行等)。
  • []:字符集合(如 [a-z] 匹配小写字母)。
  • |:逻辑或(如 a|b 匹配 a 或 b)。
  • 量词
  • *:匹配前一个字符 0 次或多次。
  • +:匹配前一个字符 1 次或多次。
  • ?:匹配前一个字符 0 次或 1 次。
  • {m}:匹配前一个字符恰好 m 次。
  • {m,n}:匹配前一个字符 m 到 n 次。
  • 分组与捕获
  • ():定义捕获组(可通过索引或命名引用)。
  • (?:):非捕获组(仅分组,不捕获)。
  • ​**(2) 修饰符(Flags)​**
    修饰符 描述
    re.IGNORECASE (或 re.I) 忽略大小写
    re.MULTILINE (或 re.M) 多行模式(^ 和 $ 匹配每行的开头/结尾)
    re.DOTALL (或 re.S) . 匹配包括换行符在内的所有字符
    re.VERBOSE (或 re.X) 允许正则表达式换行并添加注释

     

    3. 常用函数与示例

    ​**(1) 匹配与搜索**
    函数 描述 示例
    re.match(pattern, string) 从字符串开头匹配模式,成功返回 Match 对象,否则返回 None re.match(r'\d+', '123abc') → Match 对象(匹配 '123')
    re.search(pattern, string) 扫描整个字符串查找第一个匹配,成功返回 Match 对象,否则返回 None re.search(r'\d+', 'abc123def') → Match 对象(匹配 '123')
    re.findall(pattern, string) 返回所有非重叠匹配的列表(直接返回字符串或元组列表)。 re.findall(r'\d+', 'a1b22c333') → ['1', '22', '333']
    re.finditer(pattern, string) 返回所有匹配的迭代器,每个元素是 Match 对象。 [m.group() for m in re.finditer(r'\d+', 'a1b22')] → ['1', '22']

     示例代码

    import re
    
    text = "Email: user@example.com, Phone: 123-456-7890"
    # 提取邮箱
    email = re.search(r'\w+@\w+\.\w+', text).group()  # 'user@example.com'
    # 提取所有电话号码片段
    phones = re.findall(r'\d{3}-\d{3}-\d{4}', text)   # ['123-456-7890']

    **(2) 替换与分割**

     

    函数 描述 示例
    re.sub(pattern, repl, string) 将匹配模式的部分替换为 repl,返回新字符串。 re.sub(r'\d+', '#', 'a1b22c') → 'a#b#c'
    re.split(pattern, string) 按模式分割字符串,返回列表。 re.split(r'\W+', 'Hello, world!') → ['Hello', 'world', '']

     示例代码

    # 替换日期格式(YYYY-MM-DD → DD/MM/YYYY)
    date = "2023-10-05"
    new_date = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\3/\2/\1', date)  # '05/10/2023'
    
    # 分割复杂文本
    text = "apple,,banana;;cherry"
    parts = re.split(r'[,;]+', text)  # ['apple', 'banana', 'cherry']

     ​**(3) 预编译正则表达式**

    使用 re.compile() 预编译正则表达式以提高效率(尤其需多次使用同一模式时):

    pattern = re.compile(r'\d+')
    match = pattern.match('123abc')  # 等效于 re.match(r'\d+', '123abc')

     **(4) 匹配对象(Match Object)​**

    成功匹配后返回的 Match 对象提供以下方法:

    方法 描述
    group(n) 返回第 n 个分组(默认 n=0 表示整个匹配)。
    groups() 返回所有分组的元组。
    start() / end() 返回匹配的起始/结束索引。
    span() 返回匹配的索引范围元组 (start, end)

     示例

    text = "Date: 2023-10-05"
    match = re.search(r'(\d{4})-(\d{2})-(\d{2})', text)
    if match:
        print(match.group(0))   # '2023-10-05'
        print(match.group(1))   # '2023'
        print(match.groups())   # ('2023', '10', '05')
        print(match.span(1))    # (6, 10)

     

    4. 高级技巧

    ​**(1) 非贪婪匹配**

    默认量词(如 *+)是贪婪的(尽可能多匹配),添加 ? 可改为非贪婪模式:

    # 贪婪匹配
    re.findall(r'<.*>', '<div>text</div>')  # ['<div>text</div>']
    # 非贪婪匹配
    re.findall(r'<.*?>', '<div>text</div>') # ['<div>', '</div>']

     

    **(2) 命名分组**

    使用 (?P<name>...) 定义命名分组,通过 group('name') 访问:

    text = "ID: 123, Name: Alice"
    match = re.search(r'ID: (?P<id>\d+), Name: (?P<name>\w+)', text)
    print(match.group('id'))    # '123'
    print(match.group('name'))  # 'Alice'

     

    5. 常见问题与注意事项

     

    1. 转义字符:在正则表达式中使用 \ 需写成 \\,或使用原始字符串 r'' 简化:

      python

      re.match(r'\d+', '123')    # 正确(原始字符串)
      re.match('\\d+', '123')    # 正确(常规字符串需转义)
    2. 性能优化

    3. 多次使用同一模式时,预编译正则表达式(re.compile())。
    4. 避免过度复杂的正则表达式(如深层嵌套量词)。
    5. 匹配失败处理:检查 Match 对象是否为 None 避免异常:

      python

      match = re.search(r'\d+', 'abc')
      if match:
          print(match.group())

     

    6. 应用场景

  • 数据提取:从日志、HTML、JSON 中提取特定字段。
  • 输入验证:检查邮箱、电话、密码格式是否合法。
  • 文本清洗:替换敏感词、标准化日期格式。
  • 复杂搜索:查找符合特定模式的字符串片段。

  • 7. 总结

  • 核心功能re 模块通过正则表达式实现高效的字符串模式操作。
  • 常用函数match()search()findall()sub()split()
  • 匹配对象:利用 group()groups() 提取分组内容。
  • 高级特性:非贪婪匹配、命名分组、预编译优化。
  • 作者:wanglaqqqq

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python re库(正则表达式库)的详细指南

    发表回复