Python利用正则表达式从字符串提取数字与日期
本文详细演示如何使用Python内置的re模块及正则表达式从杂乱文本中精准提取数字序列与年月日信息。通过对比match、search与findall函数的差异,掌握核心编译参数与匹配逻辑,并提供直接可用的数字提取与日期抽取代码片段,满足日常数据处理需求。
核心目标与运行准备
在数据处理流程中,非结构化文本常包含需要解析的数值或时间戳。Python自1.5版本起内置了re模块,提供符合Perl风格的正则表达式引擎。本文的目标是借助该模块快速完成两类高频任务:按规则抽取整数/浮点数,以及定位标准格式的日期信息。无需安装第三方库,直接使用内置模块即可。
第1步:掌握基础匹配函数特性
正则操作的核心在于选择正确的匹配入口。实际使用中主要依赖以下三个函数:
re.match(pattern, string, flags=0):仅从字符串起始位置尝试匹配。若开头不符合模式则立即返回None。re.search(pattern, string, flags=0):扫描整个字符串,找到第一个成功匹配项后停止并返回匹配对象。findall(string, ...)(编译后调用)或re.findall(pattern, string, flags=0):一次性提取所有符合条件的子串,返回列表。若无结果则返回空列表[]。
关键区别:match 关注起点,search 关注首次命中,findall 关注全局收集。提取分散在多处的数字或日期时,应优先使用 findall。
第2步:使用 compile 预编译正则模式
当同一套匹配规则需在多处重复调用时,建议使用 re.compile() 预先构建正则对象。其语法为:
import re
compiled_obj = re.compile(pattern, flags=0)
常用标志参数说明:
re.I:忽略大小写re.M:多行模式(改变 ^ 和 $ 的行为)re.S:使.能够匹配换行符re.X:开启自由格式,忽略未转义的空格与#后的注释,提升复杂模式可读性
第3步:编写数字提取逻辑与对应模式
以下是抽取整数的标准实现。注意:原文代码省略了正则字符串的引号导致无法直接运行,此处已修正为合法语法。
import re
def extract_numbers(text):
# 匹配整数(支持负数)
pattern = re.compile(r"-?[1-9]\d*")
raw_nums = pattern.findall(text)
return [int(num) for num in raw_nums]
# 示例:text = "价格-125元,折扣30%,剩余库存0"
# 输出:[-125, 30, 0]
根据数据类型不同,正则表达式需调整边界条件。常用模式对照如下:
- 正整数:
[1-9]\d* - 负整数:
-[1-9]\d* - 非负整数:
[1-9]\d*|0 - 正浮点数:
[1-9]\d*\.\d*|0\.\d*[1-9]\d* - 负浮点数:
-([1-9]\d*\.\d*|0\.\d*[1-9]\d*) - 通用浮点数:
-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)
将上述任一模式传入 re.compile() 即可完成类型限定抽取。
第4步:实现标准年月日格式抽取
针对中文或混合分隔符的时间描述,可通过分组捕获提取 年-月-日 结构:
import re
def extract_date(context_text):
# 按行过滤空行,取前5段提高检索效率
segments = [para.strip() for para in context_text.split('\n') if para.strip()][:5]
for seg in segments:
# 匹配 YYYY 年/月/日 或 YYYY/MM/DD 等组合
ret = re.findall(r'(\d{4})\s*[\./年-]\s*(\d{1,2})\s*[\./月-]\s*(\d{1,2})\s*日?', seg)
if ret:
y, m, d = ret[0]
return f"{y}/{m.lstrip('0')}/{d.lstrip('0')}"
return None
该函数会逐段扫描输入文本,遇到首个匹配的日期即返回标准化格式。若未找到则返回 None。
结果验证与常见排错
完成代码编写后,可通过以下方式确认提取结果是否符合预期:
- 观察返回值类型:数字提取函数应返回
list,日期函数返回str或None。打印调试变量可快速核对。 - 检查转义字符:正则中的特殊符号(如
.,*,|)若在普通文本中本意不是通配符,必须使用反斜杠\转义,或使用原始字符串前缀r""。 - 处理空匹配:当
findall返回空列表时,通常是模式贪婪度不足或分隔符写法未覆盖实际文本特征,可先使用在线正则测试工具校验后再放入业务代码。
总结
依托Python内置的 re 模块与合理的正则设计,可以稳定完成从复杂字符串到结构化数据的转换。明确匹配范围、正确书写原始字符串模式、按需启用编译缓存,是保障解析效率的关键。以上就是Python利用正则表达式从字符串提取数字与日期的详细内容,更多关于Python正则处理非结构化数据的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









