python正则表达式学习

一、正则表达式模块和方法

复制代码
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')]

八、总结要点

  1. re.findall 返回列表,没找到就是空列表。

  2. 正则里没有括号 → 返回整个匹配的列表。

  3. 括号 → 只返回括号里的东西;多个括号就返回元组列表。

  4. 想精确匹配时,用 ? 去掉贪婪。

  5. 练习时多用 r"..." 防止转义问题。