一、正则表达式模块和方法
import re
re.findall(正则表达式, 要搜索的字符串)
去字符串里找出所有符合模板的内容 ,然后打包成一个列表还给你。找不到就返回空列表。
二、最简单的例子:找数字
python
import re
text = "我的电话是13812345678,邮编是100081"
result = re.findall(r'\d+', text)
print(result) # ['13812345678', '100081']
-
\d代表一个数字 -
\d+代表连续的数字(至少一个) -
结果把所有连续数字都拿出来了
三、常用符号速查表
| 符号 | 含义 | 示例匹配 |
|---|---|---|
. |
任意字符(换行除外) | a.c 可匹配 "abc", "a1c" |
\d |
数字 | \d 匹配 "0"~"9" |
\w |
字母、数字、下划线 | \w 匹配 "a", "B", "3", "_" |
\s |
空白字符(空格、tab等) | a\sb 匹配 "a b" |
+ |
前面元素出现1次或多次 | a+ 匹配 "a", "aaa" |
* |
前面元素出现0次或多次 | a* 匹配 "", "a", "aaa" |
? |
前面元素出现0次或1次 | colou?r 匹配 "color" 或 "colour" |
{n} |
刚好出现 n 次 | \d{3} 匹配 3位数字 |
{n,m} |
出现 n 到 m 次 | \d{2,4} 匹配 2到4位数字 |
[] |
匹配括号里的任意一个字符 | [aeiou] 匹配任意一个元音字母 |
[^] |
匹配不在括号里的任意字符 | [^0-9] 匹配非数字 |
^ |
匹配字符串开头 | ^Hello |
$ |
匹配字符串结尾 | world$ |
注意:在 Python 里写正则时,建议用 原始字符串 r"...",避免 \ 被当作转义符。
四、用括号 () 分组提取
情况一:正则里没有括号
findall 返回的是整个匹配的字符串列表。
python
re.findall(r'\d+', 'a1b22c333') # ['1', '22', '333']
情况二:正则里有1个括号
findall 返回的是每个匹配中括号里的内容组成的列表。
python
text = "姓名:张三, 年龄:25; 姓名:李四, 年龄:30"
# 我们想提取所有年龄数字
re.findall(r'年龄:(\d+)', text)
# 返回 ['25', '30'] → 括号里的 \d+ 部分
情况三:正则里有多个括号
返回元组的列表,每个元组里的元素按括号顺序排列。
python
text = "张三,25; 李四,30"
re.findall(r'(\w+),(\d+)', text)
# 返回 [('张三', '25'), ('李四', '30')]
五、容易踩的坑:贪婪匹配
默认 + 和 * 是贪婪的,会尽可能多吃字符。有时结果会出乎意料:
python
text = "<div>内容1</div><div>内容2</div>"
# 想提取每个 div 里的内容
re.findall(r'<div>(.*)</div>', text)
# 返回 ['内容1</div><div>内容2'] ???
因为 .* 直接吃到了最后一个 </div>。解决方法是在后面加 ? 变成非贪婪模式:
python
re.findall(r'<div>(.*?)</div>', text)
# 返回 ['内容1', '内容2']
六、忽略大小写等常用标志
在 findall 里可以加第三个参数 flags:
python
re.findall(r'hello', 'Hello, HELLO', re.IGNORECASE)
# 返回 ['Hello', 'HELLO']
七、万能练习模板
python
import re
# 1. 简单提取
print(re.findall(r'\d+', '我有3个苹果,5个橘子')) # ['3', '5']
# 2. 分组提取
print(re.findall(r'(\w+)=(\d+)', 'x=10 y=20')) # [('x','10'), ('y','20')]
# 3. 多分组提取复杂信息
log = "2025-01-01 12:00 ERROR message, 2025-01-01 13:00 OK done"
pattern = r'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}) (\w+)'
print(re.findall(pattern, log))
# [('2025-01-01', '12:00', 'ERROR'), ('2025-01-01', '13:00', 'OK')]
八、总结要点
-
re.findall返回列表,没找到就是空列表。 -
正则里没有括号 → 返回整个匹配的列表。
-
有括号 → 只返回括号里的东西;多个括号就返回元组列表。
-
想精确匹配时,用
?去掉贪婪。 -
练习时多用
r"..."防止转义问题。