人人都会AI编程

15.2 re 模块核心方法:match、search、findall、sub、split

更新时间:2026-07-12

Python 的 re 模块提供了正则表达式的完整支持。理解下面五个最常用的方法,你就能应对 90% 的正则处理场景。

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

  • 行为:从字符串的开头开始尝试匹配。如果开头位置匹配成功,返回一个匹配对象;否则返回 None
  • 典型用法:验证某个字符串是否以特定模式开头,比如检查手机号首位、网址协议等。
  • 示例
  import re
  result = re.match(r'\d+', '123abc')
  if result:
      print(result.group())   # 输出: 123
  # 注意:字符串开头不是数字就会失败
  result2 = re.match(r'\d+', 'abc123')
  print(result2)              # None
  

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

  • 行为:扫描整个字符串,返回第一个成功匹配的对象。如果没有匹配,返回 None
  • 典型用法:找到字符串中第一次出现的模式,不需要从开头限定。
  • 示例
  text = "价格是 100 元"
  m = re.search(r'\d+', text)
  if m:
      print(m.group())         # 输出: 100
  # 与 match 的区别:search 不要求从开头匹配
  m2 = re.search(r'\d+', 'abc123def')
  print(m2.group())            # 输出: 123
  

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

  • 行为:以列表形式返回字符串中所有不重叠匹配的字符串。如果正则中包含捕获组 (()),则返回的是元组列表(每个元组包含各组的捕获内容)。
  • 典型用法:提取文本中所有出现的模式,比如找出所有邮箱、所有数字等。
  • 示例
  text = "a1b2c3"
  print(re.findall(r'\d', text))          # ['1', '2', '3']
  # 带捕获组时返回元组列表
  print(re.findall(r'(\d)([a-z])', '1a2b3c'))  # [('1', 'a'), ('2', 'b'), ('3', 'c')]
  

re.sub(pattern, repl, string, count=0, flags=0)

  • 行为:搜索字符串中的模式,并用 repl 替换。默认替换所有匹配,可通过 count 参数限制替换次数。返回替换后的新字符串,原字符串不变。
  • repl 可以是字符串或函数:字符串中可用 \1\g<name> 引用捕获组;函数接收匹配对象,返回替换字符串。
  • 典型用法:清洗数据(去除空格、格式化)、掩码敏感信息、文本转换。
  • 示例
  # 简单替换
  text = "I like cat and cat"
  new_text = re.sub(r'cat', 'dog', text)
  print(new_text)                 # I like dog and dog

  # 引用捕获组:日期格式转换
  date_str = "2025-03-15"
  new_date = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', date_str)
  print(new_date)                 # 03/15/2025

  # 使用函数:将匹配的数字乘以 2
  def double(m):
      return str(int(m.group()) * 2)
  print(re.sub(r'\d+', double, 'a1b2c3'))  # a2b4c6
  

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

  • 行为:用正则表达式指定的分隔符拆分字符串,功能比 str.split() 更强大。返回拆分后的字符串列表。如果正则中包含捕获组,捕获的内容也会作为结果的一部分保留在列表中。
  • 典型用法:按多种分隔符切分、处理空白字符、从杂乱文本中提取字段。
  • 示例
  # 按空格、逗号或分号拆分
  text = "a,b;c d"
  parts = re.split(r'[ ,;]+', text)
  print(parts)                     # ['a', 'b', 'c', 'd']

  # 保留分隔符(使用捕获组)
  parts2 = re.split(r'([ ,;])', text)
  print(parts2)                    # ['a', ',', 'b', ';', 'c', ' ', 'd']
  

掌握了这五个方法,你基本就能完成字符串的验证、查找、提取、替换和拆分任务。在使用时,建议预先用 re.compile() 编译正则对象以提高多次使用时的效率,这也是 re 模块的最佳实践。