问题: 如何用正则表达式匹配一个字符串中的所有数字?

👇 点击展开/折叠 面试背诵模板(建议先背这个) 使用 re 模块的 findall 函数,配合模式 r'\d+' 即可匹配字符串中的所有连续数字,返回字符串列表。\d 匹配任意 Unicode 数字字符(等价于 [0-9]),+ 表示匹配一次或多次,确保将连续数字合并为一个整体而非单个字符。若需匹配整数,直接使用 re.findall(r'\d+', text);若需匹配带小数的数字,使用 r'\d+\.\d+'。注意 re.match 仅从开头匹配,不适用此场景。
---

findall 与 finditer 的选择

re.findall() 直接返回所有匹配结果的列表,适合数据量较小的场景;re.finditer() 返回迭代器,逐个生成 Match 对象,适合处理超大文本或需获取匹配位置(如 span())的场景,内存效率更高。

1
2
3
4
5
6
7
8
9
import re
text = "2024年销售额增长15.6%,成本下降3.2%"

# findall 返回列表
print(re.findall(r'\d+', text)) # ['2024', '15', '6', '3', '2']

# finditer 返回迭代器,逐项处理
for match in re.finditer(r'\d+', text):
print(match.group(), match.span())

匹配浮点数与负数(扩展规则)

业务场景中常需提取完整的数值(包含小数点和负号),需构造复合模式:

1
2
3
4
5
6
7
# 匹配整数、浮点数(含负号)
pattern = r'-?\d+\.?\d*' # 可匹配 -3.14, 10, .5
print(re.findall(pattern, "温度: -5.2℃, 湿度: 80%, 增量: .5"))
# ['-5.2', '80', '.5']

# 更严谨的浮点数匹配(避免单独匹配小数点)
pattern = r'-?\d+(?:\.\d+)?' # 非捕获分组,整数或浮点数

模式对比与常见陷阱

模式 匹配结果 说明
\d 每个数字单独匹配('1','2','3') 未使用量词,仅匹配单个字符
\d+ 连续数字整体匹配('123') 最常用的整数提取方式
\d* 可能匹配空字符串 陷阱:findall 会返回空字符串,需谨慎使用

注意:\d 默认匹配 Unicode 数字(如阿拉伯数字 ٣),若只匹配 0-9,应改用 [0-9] 确保 ASCII 数字。