re.findall() 是 Python re 模块中的一个函数,用于在字符串中查找所有匹配正则表达式的子串,并返回一个列表。这些子串是与正则表达式模式匹配的部分。re.findall() 适用于当我们想提取字符串中所有符合某个模式的部分时。

基本语法

import re
re.findall(pattern, string, flags=0)
  • pattern: 正则表达式模式,它指定了你要匹配的文本模式。
  • string: 目标字符串,在这个字符串中查找符合模式的所有子串。
  • flags: 可选参数,用于控制匹配方式。常用的标志有 re.IGNORECASEre.DOTALLre.MULTILINE 等。

返回值

re.findall() 返回一个列表,其中包含所有匹配正则表达式的子串。如果没有找到匹配的子串,则返回空列表 []

示例讲解

1. 基本使用

假设我们要从一个字符串中提取所有的数字:

import re

text = "There are 3 apples, 5 bananas, and 12 oranges."
result = re.findall(r'\d+', text)

print(result)

输出:

['3', '5', '12']

在这个例子中:

  • 正则表达式 \d+ 匹配一个或多个数字。
  • re.findall() 会返回所有符合 \d+ 模式的子串,也就是 "3", "5", 和 "12"

2. 提取单词

如果我们想提取所有的单词:

text = "Hello, world! Let's explore Python."
result = re.findall(r'\b\w+\b', text)

print(result)

输出:

['Hello', 'world', 'Let', 's', 'explore', 'Python']

在这个例子中:

  • 正则表达式 \b\w+\b 匹配一个单词边界(\b),然后是一个或多个字母、数字或下划线(\w+),最后是另一个单词边界。
  • 结果中提取了所有单词,注意这里 "Let's" 被分为 "Let""s",因为正则模式会将所有非字母字符(如 ')当作分隔符。

3. 使用分组提取特定部分

如果我们使用括号 () 来分组正则表达式的某部分,re.findall() 会返回匹配的分组(即只返回括号中的部分)。

text = "My email is test@example.com and my friend's email is friend@mail.com."
result = re.findall(r'(\w+)@(\w+\.\w+)', text)

print(result)

输出:

[('test', 'example.com'), ('friend', 'mail.com')]

在这个例子中:

  • 正则表达式 (\w+)@(\w+\.\w+) 匹配电子邮件地址。括号中的部分会被捕获并返回。
  • re.findall() 返回的是一个包含元组的列表,每个元组包含两个部分:用户名和域名。

4. 匹配空白字符

我们还可以匹配空白字符,例如空格、制表符等。

text = "Hello   world! This\tis  an example."
result = re.findall(r'\s+', text)

print(result)

输出:

['   ', '\t', '  ']

这里:

  • 正则表达式 \s+ 匹配一个或多个空白字符(包括空格、制表符等)。
  • 返回的是文本中所有空白字符的列表。

使用 flags 参数

flags 参数可以用来控制正则表达式的匹配行为,常用的标志包括:

  • re.IGNORECASE:忽略大小写。
  • re.DOTALL:让 . 匹配包括换行符在内的所有字符。
  • re.MULTILINE:使 ^$ 匹配每一行的开始和结束。

举个例子,忽略大小写匹配:

text = "Hello World, hello Python!"
result = re.findall(r'hello', text, flags=re.IGNORECASE)

print(result)

输出:

['Hello', 'hello']

总结

re.findall() 是 Python 中非常强大的正则表达式匹配函数,它允许我们在字符串中查找所有符合某种模式的子串。常见的应用包括提取数据(如电话号码、电子邮件、日期等),以及对文本内容的批量处理和过滤。

常见的应用场景包括:

  • 文本数据提取
  • 数据清洗
  • 日志文件分析
  • 爬虫抓取

掌握 re.findall() 和正则表达式,可以让你在数据处理中更加高效和灵活。