python中如何使用正则表达式提取数字?

使用re模块结合正则表达式可精确提取文本中的整数、浮点数、负数及带符号或单位的数字,通过r'[-+]?d+(?:.d+)?’等模式匹配,并用findall或search配合捕获组提取所需部分,再转换为数值类型进行处理。

python中如何使用正则表达式提取数字?

在Python里,要从文本中抓取数字,最直接、也最灵活的工具就是

re

模块,也就是正则表达式。它能帮你根据预设的模式,把字符串里所有符合条件的数字都找出来。这比你手动去遍历字符串、判断每个字符是不是数字要高效和优雅得多,尤其是在处理复杂文本时。

解决方案

使用Python的

re

模块提取数字,通常我们会用到

re.findall()

函数。这个函数会返回一个列表,包含所有匹配到的非重叠字符串。

最基础的数字模式是

d+

,它能匹配一个或多个数字字符(0-9)。但实际情况往往更复杂,数字可能包含小数点、正负号,或者混杂在其他文本中。

import retext1 = "我有100个苹果和20.5公斤的香蕉,还有-5个坏梨。"text2 = "订单号是123456789,总价为999.99元。"text3 = "我的身高是175cm,体重是68.3kg。"# 1. 提取整数# 模式:d+ 匹配一个或多个数字integers = re.findall(r'd+', text1)print(f"提取整数 (text1): {integers}") # ['100', '20', '5'] - 注意这里会把20.5的20和5分开# 2. 提取浮点数和整数(更通用的数字模式)# 模式:d+.d* 或者 d*.d+ 或者更通用的 d+.?d*# 考虑到数字可能带小数点,我们用 d+.?d* 来匹配,它会匹配至少一个数字,# 后面可选地跟着一个小数点,再后面可选地跟着零个或多个数字。# 这样可以匹配 "100", "20.5", "5." (虽然实际中"5."不常见,但模式会匹配)numbers_general = re.findall(r'd+.?d*', text1)print(f"提取通用数字 (text1): {numbers_general}") # ['100', '20.5', '5']# 3. 提取带正负号的数字# 模式:[-+]?d+.?d* 匹配可选的正负号,然后是通用数字模式signed_numbers = re.findall(r'[-+]?d+.?d*', text1)print(f"提取带符号数字 (text1): {signed_numbers}") # ['100', '20.5', '-5']# 4. 结合实际场景,提取特定格式的数字# 比如从"订单号是123456789"中提取订单号order_id_match = re.search(r'订单号是(d+)', text2)if order_id_match:    print(f"提取订单号 (text2): {order_id_match.group(1)}") # group(1) 获取括号内的内容# 5. 提取带有单位的数字,但只保留数字部分# 比如从"175cm"中提取175height_match = re.search(r'(d+.?d*)cm', text3)if height_match:    print(f"提取身高数字 (text3): {height_match.group(1)}") # '175'

说实话,正则表达式这东西,初看会觉得有点像天书,但一旦你掌握了几个核心元字符和量词,它在文本处理上的能力会让你大呼过瘾。上面这些模式,基本能覆盖你日常提取数字的大部分需求了。

立即学习“Python免费学习笔记(深入)”;

如何在复杂文本中精确提取各类数字,包括整数、浮点数和负数?

在真实世界的文本里,数字的形态是多种多样的,比如可能夹杂着单位,或者用逗号做千位分隔符。要精确提取,我们就得构建更精细的正则表达式。这就像给一个模糊的目标画出清晰的轮廓。

一个比较全面的数字匹配模式,可以考虑以下几点:

正负号: 数字前面可能有

+

-

。用

[-+]?

来匹配可选的正负号。整数部分: 至少一个数字。

d+

小数部分: 小数点是可选的,后面可以跟零个或多个数字。

.?d*

组合: 将上述部分组合起来,得到

[-+]?d+.?d*

。这个模式能捕获像 “123”, “12.3”, “-45”, “+6.78” 这样的数字。

但如果你想更严谨地匹配浮点数,比如确保小数点后有数字,或者小数点前有数字,可以调整为:

[-+]?d+.d+

: 匹配 “12.3”, “-4.5″,但不匹配 “12” 或 “0.5”。

[-+]?(?:d+.d*|d*.d+)

: 匹配 “12.3”, “0.5”, “12.” (如果允许),但不匹配 “12”。我个人更倾向于使用

[-+]?d+(?:.d+)?

。这个模式是说:可选的正负号,接着至少一个数字,然后是一个非捕获组

(?:.d+)?

,这个组表示可选地匹配一个小数点和至少一个数字。这样既能匹配整数,也能匹配像 “12.3” 这样的浮点数,而且不会匹配单独的 “.” 或者 “12.” 这种可能不是你想要的浮点数。

import recomplex_text = "今天的气温是-5.5℃,昨天下雨量是20mm,预计明天股价上涨1.23%,订单总额达到1,234,567.89元。"# 提取所有看起来像数字的字符串# 使用我偏好的模式:可选正负号,至少一个数字,可选的小数点和至少一个数字all_numbers_str = re.findall(r'[-+]?d+(?:.d+)?', complex_text)print(f"从复杂文本中提取的数字字符串: {all_numbers_str}")# 输出: ['-5.5', '20', '1.23', '1', '234', '567.89']# 注意:这里会把 "1,234,567.89" 拆分成 "1", "234", "567.89"# 如果要处理千位分隔符,模式需要更复杂一些# 匹配可能带逗号的整数或浮点数# 这里我用一个稍微激进的模式:允许数字之间有逗号,但逗号后必须跟三位数字# 并且整个数字可以有可选的小数部分numbers_with_commas = re.findall(r'[-+]?d{1,3}(?:,d{3})*(?:.d+)?', complex_text)print(f"处理千位分隔符后的数字字符串: {numbers_with_commas}")# 输出: ['-5.5', '20', '1.23', '1,234,567.89']# 这个模式就精确多了,成功地将 "1,234,567.89" 作为一个整体提取出来。# 这种精细化的匹配,需要你对可能出现的数字格式有清晰的预期。# 比如,如果数字后面总是跟着单位,而你只想要数字,可以用捕获组:temperature_match = re.search(r'([-+]?d+(?:.d+)?)℃', complex_text)if temperature_match:    print(f"提取气温数字: {temperature_match.group(1)}") # '-5.5'

这里面的关键在于

?

(0次或1次)、

+

(1次或多次)、

*

(0次或多次)这些量词,以及

()

捕获组和

(?:)

非捕获组的灵活运用。构建正确的模式,就像是给你的文本数据量身定制一把钥匙。

提取到的数字是字符串,如何将其转换为数值类型进行后续处理?

re.findall()

返回的,或者

match.group()

捕获到的,都是字符串类型。这很合理,因为正则表达式本身就是处理字符串的。但我们通常提取数字是为了进行计算、比较或者其他数值操作,所以下一步往往就是把它们转换成

int

(整数)或

float

(浮点数)。

这个转换过程相对直观,Python提供了内置的

int()

float()

函数。不过,有几个小细节值得注意:

类型选择: 如果你的数字可能包含小数,那就用

float()

。如果确定都是整数,用

int()

会更合适。错误处理: 虽然你的正则表达式应该已经过滤掉了非数字字符,但万一有意外,比如匹配到了一个空字符串或者一个不完全的数字,

int()

float()

转换时可能会抛出

ValueError

。在实际项目中,你可能需要用

try-except

块来处理这种情况,或者确保你的正则表达式足够健壮。批量转换: 如果

re.findall()

返回了一个数字字符串列表,你可以用列表推导式(list comprehension)或者

map()

函数来高效地批量转换。

import retext = "价格是100元,折扣后是85.5折,会员价-10元。库存量:500000。"# 提取所有可能带符号的浮点数或整数# 这里我们用一个比较通用的模式,能抓取到大部分我们想要的数字形态# 考虑到可能有千位分隔符,我们先不直接处理,在转换时再去除numbers_as_strings = re.findall(r'[-+]?d+(?:,d{3})*(?:.d+)?', text)print(f"原始提取的数字字符串: {numbers_as_strings}")# 输出: ['100', '85.5', '-10', '500,000']# 转换为数值类型converted_numbers = []for num_str in numbers_as_strings:    # 在转换前,先去除千位分隔符,否则float()或int()会报错    cleaned_num_str = num_str.replace(',', '')    try:        if '.' in cleaned_num_str:            converted_numbers.append(float(cleaned_num_str))        else:            converted_numbers.append(int(cleaned_num_str))    except ValueError:        print(f"警告: 无法将 '{num_str}' 转换为数值类型,已跳过。")        # 实际项目中,你可能需要更复杂的错误处理逻辑print(f"转换后的数值列表: {converted_numbers}")# 输出: [100, 85.5, -10, 500000]# 使用列表推导式和map()的简洁方式# 假设我们已经确保了字符串都是干净的数字(无逗号)cleaned_numbers_str = [s.replace(',', '') for s in numbers_as_strings]float_numbers = [float(s) for s in cleaned_numbers_str if '.' in s]int_numbers = [int(s) for s in cleaned_numbers_str if '.' not in s]print(f"浮点数列表 (通过推导式): {float_numbers}")print(f"整数列表 (通过推导式): {int_numbers}")# 如果你知道所有数字都可能是浮点数,直接用mapall_as_floats = list(map(float, cleaned_numbers_str))print(f"所有数字转换为浮点数 (通过map): {all_as_floats}")

这块的重点是

replace(',', '')

这一步,它是在将字符串转换为数值类型前,处理掉那些可能导致转换失败的非数字字符(比如千位分隔符)。这体现了数据清洗在数据处理流程中的重要性。

面对特殊场景,如带有单位或特定分隔符的数字,正则表达式还能胜任吗?

当然可以,而且这正是正则表达式的强项之一。当数字和单位、特定的前缀或后缀、或者非标准分隔符混在一起时,我们可以通过更精巧的模式来“雕刻”出我们真正想要的数字。这就像在沙子里淘金,需要更细密的筛子。

关键在于使用捕获组

()

。捕获组允许你从整个匹配结果中,只提取模式中特定部分的内容。

import respecial_text = "订单号:XYZ-12345, 金额: $99.99, 生产日期: 2023-10-26, 数量: 100件, 编码: #A-B-C-42."# 1. 提取订单号中的数字部分 (例如 XYZ-12345 中的 12345)# 模式:XYZ-后面跟着数字order_id_match = re.search(r'XYZ-(d+)', special_text)if order_id_match:    print(f"订单号数字: {order_id_match.group(1)}") # '12345'# 2. 提取带货币符号的金额 (例如 $99.99)# 模式:$后面跟着一个数字模式amount_match = re.search(r'$(d+(?:.d+)?)', special_text)if amount_match:    print(f"金额: {amount_match.group(1)}") # '99.99'# 3. 提取带有单位的数字 (例如 100件)# 模式:数字后面跟着单位quantity_match = re.search(r'(d+)件', special_text)if quantity_match:    print(f"数量: {quantity_match.group(1)}") # '100'# 4. 提取日期中的年份、月份、日期# 模式:(d{4})-(d{2})-(d{2}) 分别捕获年、月、日date_match = re.search(r'(d{4})-(d{2})-(d{2})', special_text)if date_match:    year, month, day = date_match.groups() # groups()返回所有捕获组的元组    print(f"生产日期: 年={year}, 月={month}, 日={day}") # 年=2023, 月=10, 日=26# 5. 从混合编码中提取最后一个数字 (例如 #A-B-C-42 中的 42)# 模式:匹配一个非数字或连字符的字符,直到最后一个连字符后跟着数字code_number_match = re.search(r'-(d+)$', special_text) # $表示字符串结尾if code_number_match:    print(f"编码中的数字: {code_number_match.group(1)}") # '42'# 更复杂的例子:提取所有括号内的数字text_with_parentheses = "项目A (ID: 123), 项目B (ID: 456), 错误码 (Err: 789)."numbers_in_parentheses = re.findall(r'((?:ID|Err):s*(d+))', text_with_parentheses)print(f"括号内ID/Err数字: {numbers_in_parentheses}") # ['123', '456', '789']

这里面,

re.search()

re.findall()

的选择也很关键。

re.search()

只找第一个匹配项,通常用于提取特定格式的唯一信息;而

re.findall()

则会找出所有非重叠的匹配项,适用于你需要批量提取同类信息的情况。当你的模式中包含捕获组时,

re.findall()

会直接返回捕获组的内容列表,而不是整个匹配项。这在使用上非常方便。

总的来说,正则表达式在Python中处理数字提取,就像一把瑞士军刀,功能多且强大。关键在于理解你的数据形态,然后构建出恰到好处的模式。多实践,多尝试,你会发现它的乐趣。

以上就是python中如何使用正则表达式提取数字?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1372069.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 12:00:31
下一篇 2025年12月14日 12:00:41

相关推荐

  • Golang如何实现文件加密存储 加密算法与安全写入方案

    golang 中实现文件加密存储需注意三个关键点:加密算法选择、安全写入和密钥管理。一、加密算法推荐使用 aes-gcm 或 chacha20-poly1305,go 标准库提供良好支持,且需确保每次加密使用唯一 nonce;二、写入过程应避免临时文件暴露原始数据,采用原子写入操作并启用同步机制确保…

    2025年12月15日 好文分享
    000
  • Golang垃圾回收机制影响性能 如何调整GC参数

    golang 的垃圾回收机制确实会影响程序性能,尤其在高并发或内存压力大时。1. 理解 gc 原理:采用三色标记清除算法,gc 触发与堆内存增长和 gogc 参数相关;2. 调整 gogc:默认 100,提高数值可降低 gc 频率从而减少 cpu 占用但增加内存使用;3. 使用 gomemlimit…

    2025年12月15日 好文分享
    000
  • Golang反射与JSON序列化的关系 解析Golang反射在JSON中的应用

    golang的反射机制在json序列化中起核心作用,通过反射动态获取结构体字段及标签实现字段映射与类型识别。具体表现为:1. encoding/json库使用反射遍历结构体字段并解析json tag以决定序列化方式;2. 反射带来性能损耗,字段越多、结构越复杂、并发越高则开销越大;3. 优化手段包括…

    2025年12月15日 好文分享
    000
  • Golang如何助力云原生应用开发 解析容器化与微服务架构

    golang在云原生应用开发中具有显著优势。1. golang编译出的二进制文件体积小、启动快、资源占用低,适合容器化环境,并可静态编译为单一可执行文件,简化docker镜像构建;2. 其并发模型(goroutines和channels)能高效处理大量并发请求,适合微服务架构的高性能需求;3. 使用…

    2025年12月15日 好文分享
    000
  • 如何用Golang防范Web安全威胁 讲解CSRF、XSS防护措施

    防范 csrf 的核心是使用 token 验证,每次用户发起敏感操作时服务器生成唯一 token 并与用户会话绑定,处理请求时验证一致性,不一致则拒绝请求;防范 xss 的关键是对用户输入进行编码和转义,如使用 html.escapestring 进行 html 实体编码,并结合 csp 设置资源加…

    2025年12月15日 好文分享
    000
  • 怎样用Golang开发一个天气查询工具 调用第三方API实战

    用golang开发天气查询工具的步骤如下:1.准备可用的天气api如openweathermap并获取api key;2.使用net/http库发起http请求调用api并处理响应;3.定义结构体解析json数据并转换温度单位;4.通过flag包支持命令行参数输入城市和密钥。整个过程需注意错误处理、…

    2025年12月15日 好文分享
    000
  • Golang反射如何遍历字段 学习Golang反射遍历结构体字段的方法

    在 golang 中,使用 reflect 包可动态遍历结构体字段。1. 通过 reflect.typeof 获取结构体类型,结合 .numfield() 和 .field(i) 遍历字段名;2. 使用 field.tag.get(“json”) 可读取字段标签;3. 对匿名…

    2025年12月15日 好文分享
    000
  • Go项目使用Elasticsearch查询超时怎么调整

    全民k歌:歌房舞台效果开启指南 腾讯出品的全民K歌,以其智能打分、修音、混音和专业音效等功能,深受K歌爱好者喜爱。本教程将详细指导您如何在全民K歌歌房中开启炫酷的舞台效果。 步骤: 打开全民K歌并进入歌房: 打开全民K歌APP,点击底部菜单栏中的“歌房”图标进入。 进入歌房: 在歌房界面底部,点击“…

    2025年12月15日 好文分享
    000
  • Golang模块缓存机制如何工作 解析GOMODCACHE目录结构

    全民k歌:歌房舞台效果开启指南 腾讯出品的全民K歌,以其智能打分、修音、混音和专业音效等功能,深受K歌爱好者喜爱。本教程将详细指导您如何在全民K歌歌房中开启炫酷的舞台效果。 步骤: 打开全民K歌并进入歌房: 打开全民K歌APP,点击底部菜单栏中的“歌房”图标进入。 立即学习“go语言免费学习笔记(深…

    2025年12月15日 好文分享
    000
  • Golang反射与空接口的区别是什么 对比interface{}与reflect.Value的特性

    全民k歌:歌房舞台效果开启指南 腾讯出品的全民K歌,以其智能打分、修音、混音和专业音效等功能,深受K歌爱好者喜爱。本教程将详细指导您如何在全民K歌歌房中开启炫酷的舞台效果。 步骤: 打开全民K歌并进入歌房: 打开全民K歌APP,点击底部菜单栏中的“歌房”图标进入。 立即学习“go语言免费学习笔记(深…

    2025年12月15日 好文分享
    000
  • 如何在Golang中实现服务网格 集成Linkerd2-proxy的Sidecar模式

    要将linkerd2-proxy作为sidecar集成到golang服务中,核心在于部署层面的配置而非代码修改。1. 确保kubernetes集群已安装linkerd控制平面;2. 在应用的deployment等资源清单中添加linkerd.io/inject: enabled注解;3. linke…

    2025年12月15日 好文分享
    000
  • Golang基准测试结果如何正确解读 分析ns/op与MB/s等关键指标

    解读 golang 基准测试结果需关注多个核心指标并结合实际场景,1.ns/op 越低性能越好,反映单次操作延迟;2.allocs/op 和 b/op 表示内存分配情况,越少越优;3.mb/s 衡量吞吐量,数值越高代表处理能力越强;4.需多次运行取平均值以确保准确性;5.应比较不同实现或版本的测试结…

    2025年12月15日 好文分享
    000
  • Golang中指针在并发环境下的安全性 分析Golang指针在并发中的风险与应对

    指针在golang并发中不安全,因多个goroutine共享操作指针数据可能引发数据竞争。常见问题包括多goroutine同时读写导致崩溃或错误,如示例中p.count++的未定义行为。解决办法:1. 使用sync.mutex保护共享资源;2. 用atomic包处理简单类型原子操作;3. 避免共享状…

    2025年12月15日 好文分享
    000
  • Golang基准测试如何避免编译器优化 讲解KeepAlive的正确使用方式

    基准测试被优化是因为go编译器会删除无副作用的代码。1. 编译器认为未使用或无变化的变量和计算是无效代码并删除;2. 导致基准测试中实际逻辑未执行,结果失真;3. 使用runtime.keepalive可阻止变量被优化,确保代码真实运行;4. keepalive应放在循环外,仅在必要变量上使用;5.…

    2025年12月15日 好文分享
    000
  • Golang垃圾回收:如何优化GC停顿时间

    优化golang gc停顿时间需从多个方面入手。1. 控制内存分配速率,使用对象池减少临时对象创建;2. 调整gogc环境变量,找到适合应用的gc触发频率与堆大小平衡点;3. 减少大对象分配,拆分处理大数据以降低分配和回收成本;4. 使用runtime.setgcpercent()动态调整gc百分比…

    2025年12月15日 好文分享
    000
  • 如何在Chromebook上搭建Golang环境 使用Linux容器开发方案

    在chromebook上使用linux容器搭建golang开发环境可通过以下步骤完成:1. 启用linux容器(crostini)功能,在设置中找到“linux开发环境”并点击安装;2. 安装完成后打开终端,通过下载官方go二进制包并解压至/usr/local目录进行安装;3. 配置环境变量path…

    2025年12月15日
    000
  • Golang高效开发秘诀:快速构建稳定应用

    全民k歌:歌房舞台效果开启指南 腾讯出品的全民K歌,以其智能打分、修音、混音和专业音效等功能,深受K歌爱好者喜爱。本教程将详细指导您如何在全民K歌歌房中开启炫酷的舞台效果。 步骤: 打开全民K歌并进入歌房: 打开全民K歌APP,点击底部菜单栏中的“歌房”图标进入。 立即学习“go语言免费学习笔记(深…

    2025年12月15日 好文分享
    000
  • Golang如何编写单元测试 使用testing包进行代码验证

    全民k歌:歌房舞台效果开启指南 腾讯出品的全民K歌,以其智能打分、修音、混音和专业音效等功能,深受K歌爱好者喜爱。本教程将详细指导您如何在全民K歌歌房中开启炫酷的舞台效果。 步骤: 打开全民K歌并进入歌房: 打开全民K歌APP,点击底部菜单栏中的“歌房”图标进入。 立即学习“go语言免费学习笔记(深…

    2025年12月15日 好文分享
    000
  • Golang开发环境如何支持区块链 搭建Hyperledger Fabric链码测试框架

    全民k歌:歌房舞台效果开启指南 腾讯出品的全民K歌,以其智能打分、修音、混音和专业音效等功能,深受K歌爱好者喜爱。本教程将详细指导您如何在全民K歌歌房中开启炫酷的舞台效果。 步骤: 打开全民K歌并进入歌房: 打开全民K歌APP,点击底部菜单栏中的“歌房”图标进入。 立即学习“go语言免费学习笔记(深…

    2025年12月15日 好文分享
    000
  • Golang协程同步问题怎么处理?GolangWaitGroup使用技巧

    全民k歌:歌房舞台效果开启指南 腾讯出品的全民K歌,以其智能打分、修音、混音和专业音效等功能,深受K歌爱好者喜爱。本教程将详细指导您如何在全民K歌歌房中开启炫酷的舞台效果。 步骤: 打开全民K歌并进入歌房: 打开全民K歌APP,点击底部菜单栏中的“歌房”图标进入。 立即学习“go语言免费学习笔记(深…

    2025年12月15日 好文分享
    000

发表回复

登录后才能评论
关注微信