re.findall() 是 Python re 模块中的一个函数,用于在字符串中查找所有匹配正则表达式的子串,并返回一个列表。这些子串是与正则表达式模式匹配的部分。re.findall() 适用于当我们想提取字符串中所有符合某个模式的部分时。
基本语法
import re
re.findall(pattern, string, flags=0)
pattern: 正则表达式模式,它指定了你要匹配的文本模式。string: 目标字符串,在这个字符串中查找符合模式的所有子串。flags: 可选参数,用于控制匹配方式。常用的标志有re.IGNORECASE、re.DOTALL、re.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() 和正则表达式,可以让你在数据处理中更加高效和灵活。
浙公网安备 33010602011771号