Python 使用正则表达式从字符串中提取所有数字(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
引言:为什么需要从字符串中提取数字?
在编程和数据分析中,我们经常需要从文本中提取关键信息。例如,从日志文件中提取错误代码,从订单列表中提取价格,或者从网页中提取产品编号。Python 的正则表达式(Regular Expression,简称 regex)是完成这类任务的“瑞士军刀”,尤其在提取数字时,它能高效处理各种复杂场景。
本文将从零开始讲解如何使用 Python 的正则表达式从字符串中提取所有数字,适合编程初学者和中级开发者。通过循序渐进的案例和比喻,你将掌握这一实用技能,并了解其背后的逻辑。
正则表达式基础:理解“模式匹配”的核心
正则表达式是一种描述文本模式的工具,可以理解为“文字游戏规则”。它通过特定符号(元字符)定义搜索规则,例如:
\d
:匹配任意单个数字(0-9)。.
:匹配除换行符外的任意字符。+
:匹配前面的字符一次或多次。
比喻:正则表达式就像“文字侦探”
想象你是一位侦探,需要从一段文字中找出所有数字。正则表达式就是你的“通缉令”:
\d
是通缉令中的“数字通缉令”;\d+
则是“连续数字的通缉令”,例如“123”或“4567”;re.findall()
是你的“搜索工具”,根据通缉令抓取目标。
步骤 1:安装和导入 re
模块
Python 内置了 re
模块,用于处理正则表达式。使用前需先导入:
import re
步骤 2:编写正则表达式
基础案例:提取所有连续数字
假设字符串为:
text = "订单号为 12345,总金额为 99.99 美元,折扣码是 ABC123。"
要提取所有连续数字(如 12345
、99
、99
、123
),可以使用模式 \d+
:
pattern = r"\d+"
numbers = re.findall(pattern, text)
print(numbers) # 输出:['12345', '99', '99', '123']
元字符详解:理解 \d+
的含义
\d
:匹配单个数字字符;+
:表示“前面的字符可以重复一次或多次”,因此\d+
能匹配连续的数字序列。
扩展案例:处理浮点数
如果字符串包含浮点数(如 99.99
),\d+
会将其拆分为 ['99', '99']
。要完整提取浮点数,可以调整正则表达式:
pattern = r"\d+\.\d+"
numbers = re.findall(pattern, text)
print(numbers) # 输出:['99.99']
进阶技巧:处理复杂场景
案例 1:排除非数字字符干扰
假设字符串中存在非数字字符,例如:
text = "电话号码:+1-555-123-4567,邮箱:user123@example.com"
目标是提取电话号码中的数字 1234567
,但 \d+
会匹配所有连续数字,包括 1
、555
、123
、4567
。此时需要更精确的模式:
pattern = r"(\d{3}-\d{3}-\d{4})"
full_phone = re.findall(pattern, text)
print(full_phone) # 输出:['555-123-4567']
pattern = r"\d+"
all_numbers = re.findall(pattern, text)
print(all_numbers) # 输出:['1', '555', '123', '4567', '123']
案例 2:处理多行文本
如果文本包含多行,可以添加标志 re.DOTALL
或 re.MULTILINE
:
text = """
第一行:价格是 100
第二行:折扣后 50
第三行:总计 150
"""
pattern = r"\d+"
numbers = re.findall(pattern, text)
print(numbers) # 输出:['100', '50', '150']
常见问题与解决方案
问题 1:如何匹配科学计数法中的数字?
例如,字符串 "速度为 3.14e5 米/秒"
中的 3.14e5
:
text = "速度为 3.14e5 米/秒"
pattern = r"[-+]?\d*\.\d+([eE][-+]?\d+)?" # 匹配科学计数法
numbers = re.findall(pattern, text)
print(numbers) # 输出:['3.14e5']
问题 2:如何提取带千位分隔符的数字?
例如 "收入为 1,000,000"
:
text = "收入为 1,000,000"
cleaned = re.sub(r"\D", "", text) # 移除非数字字符
print(cleaned) # 输出:1000000
性能优化与注意事项
1. 预编译正则表达式
如果需要多次使用同一模式,可以预编译以提高效率:
import re
pattern = re.compile(r"\d+")
numbers = pattern.findall(text)
2. 注意边界情况
- 空字符串:
re.findall()
返回空列表。 - 非数字字符串:确保模式不会误匹配(如
r"\d+"
在"abc"
中返回空列表)。
结论:掌握正则表达式的核心价值
通过本文,你学会了如何用 Python 的正则表达式从字符串中提取数字,并理解了其背后的逻辑。正则表达式不仅是“文本过滤器”,更是解决复杂数据提取问题的工具。
下一步行动建议:
- 尝试用正则表达式处理自己的文本数据;
- 探索更多元字符(如
?
、*
、[]
)的用法; - 阅读官方文档或教程,深入理解正则表达式语法。
掌握这项技能后,无论是日志分析、数据清洗还是自动化脚本编写,你都将更加得心应手。