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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
python requests库如何发送post请求_python requests库POST请求发送方法
上一篇 2025年12月14日 12:00:31
在 macOS 上安装 NVM 后提示已安装但命令无法识别的解决方案
下一篇 2025年12月14日 12:00:41

相关推荐

  • composer require-dev和require有什么不同_Composer Require与Require-Dev区别解析

    require用于声明项目运行必需的依赖,如框架、数据库组件和第三方SDK,这些包会随项目部署到生产环境;2. require-dev用于声明仅在开发和测试阶段需要的工具,如PHPUnit、PHPStan、Faker等,不会默认部署到生产环境;3. 安装时composer install根据环境决定…

    2026年5月10日
    900
  • Matplotlib 地图中多类型图例的创建与优化

    Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化Matplotlib 地图中多类型图例的创建与优化

    本教程旨在解决matplotlib地图可视化中,如何在一个图例中同时展示颜色块(如区域分类)和自定义标记(如特定兴趣点)的问题。文章详细介绍了当传统`patch`对象无法正确显示标记时,如何利用`matplotlib.lines.line2d`创建标记图例句柄,并将其与颜色块图例句柄合并,从而生成一…

    2026年5月10日 用户投稿
    100
  • 利用海象运算符简化条件赋值:Python教程与最佳实践

    本文旨在探讨Python中海象运算符(:=)在条件赋值场景下的应用。通过对比传统if/else语句与海象运算符,以及条件表达式,分析海象运算符在简化代码、提高可读性方面的优势与局限性。并通过具体示例,展示如何在列表推导式等场景下合理使用海象运算符,同时强调其潜在的复杂性及替代方案,帮助开发者更好地掌…

    2026年5月10日
    000
  • Debian syslog性能优化技巧有哪些

    提升Debian系统syslog (通常基于rsyslog)性能,关键在于精简配置和高效处理日志。以下策略能有效优化日志管理,提升系统整体性能: 精简配置,高效加载: 在rsyslog配置文件中,仅加载必要的输入、输出和解析模块。 使用全局指令设置日志级别和格式,避免不必要的处理。 自定义模板: 创…

    2026年5月10日
    000
  • 怎么在PHP代码中实现图片上传功能_PHP图片上传功能实现与安全处理教程

    首先创建含enctype的HTML表单,再用PHP接收文件,检查目录、移动临时文件,验证类型与大小,生成唯一文件名,并调整php.ini限制以确保上传成功。 如果您尝试在PHP项目中添加图片上传功能,但服务器无法正确接收或保存文件,则可能是由于表单配置、文件处理逻辑或安全限制的问题。以下是实现该功能…

    2026年5月10日
    100
  • 比特币新手教程 比特币交易平台有哪些

    比特币是一种去中心化的数字货币,基于区块链技术实现点对点交易,具有匿名性、有限发行和不可篡改等特点;新手可通过交易所购买,P2P交易获得比特币,常用平台包括Binance、OKX和Huobi;交易流程包括注册账户、实名认证、绑定支付方式、充值法币并下单购买,可选择市价单或限价单;比特币存储方式有交易…

    2026年5月10日
    000
  • c++中的SFINAE技术是什么_c++模板编程中的SFINAE原理与应用

    SFINAE 是“替换失败不是错误”的原则,指模板实例化时若参数替换导致错误,只要存在其他合法候选,编译器不报错而是继续重载决议。它用于条件启用模板、类型检测等场景,如通过 decltype 或 enable_if 控制函数重载,实现类型特征判断。尽管 C++20 引入 Concepts 简化了部分…

    2026年5月10日
    000
  • RichHandler与Rich Progress集成:解决显示冲突的教程

    在使用rich库的`richhandler`进行日志输出并同时使用`progress`组件时,可能会遇到显示错乱或溢出问题。这通常是由于为`richhandler`和`progress`分别创建了独立的`console`实例导致的。解决方案是确保日志处理器和进度条组件共享同一个`console`实例…

    2026年5月10日
    000
  • Golang goroutine与channel调试技巧

    使用go run -race检测数据竞争,结合runtime.NumGoroutine监控协程数量,通过pprof分析阻塞调用栈,利用select超时避免永久阻塞,有效排查goroutine泄漏、死锁和数据竞争问题。 Go语言的goroutine和channel是并发编程的核心,但它们也带来了调试上…

    2026年5月10日
    000
  • 使用 Jupyter Notebook 进行探索性数据分析

    Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…

    2026年5月10日
    000
  • 网站标题关键词更新后,搜索引擎为何仍显示旧标题?

    网站标题更新后,搜索引擎为何显示旧标题? 网站SEO优化中,站长常修改网站标题关键词,期望搜索结果显示自定义标题。然而,即使更新标签、meta keywords、meta description和结构化数据中的name属性后,搜索结果仍显示旧标题,这令人费解。本文将对此进行解释。 问题:站长修改了网…

    2026年5月10日
    100
  • 深入理解 Express.js 中 next() 参数的作用与中间件机制

    本文深入探讨 express.js 中间件函数中的 `next()` 参数。它负责将控制权传递给请求-响应周期中的下一个中间件或路由处理程序。文章将详细解释 `next()` 的工作原理、中间件的注册与执行顺序,以及不正确使用 `next()` 可能导致请求挂起的风险,并通过代码示例和实际应用场景,…

    2026年5月10日
    000
  • Python命令怎样使用profile分析脚本性能 Python命令性能分析的基础教程

    使用Python的cProfile模块分析脚本性能最直接的方式是通过命令行执行python -m cProfile your_script.py,它会输出每个函数的调用次数、总耗时、累积耗时等关键指标,帮助定位性能瓶颈;为进一步分析,可将结果保存为文件python -m cProfile -o ou…

    2026年5月10日
    000
  • 如何插入查询结果数据_SQL插入Select查询结果方法

    如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法如何插入查询结果数据_SQL插入Select查询结果方法

    使用INSERT INTO…SELECT语句可高效插入数据,通过NOT EXISTS、LEFT JOIN、MERGE语句或唯一约束避免重复;表结构不一致时可通过别名、类型转换、默认值或计算字段处理;结合存储过程可提升可维护性,支持参数化与动态SQL。 将查询结果数据插入到另一个表中,可以…

    2026年5月10日 用户投稿
    000
  • PHP动态生成表单输入与POST数据获取实践指南

    本教程详细阐述了如何在php中根据动态数据源(如数据库值)生成多个表单输入框,并演示了如何通过post方法准确无误地获取这些动态生成的输入值。文章强调了正确的输入框命名策略,避免了常见的命名误区,并提供了完整的代码示例,确保开发者能够高效处理动态表单数据。 动态生成表单输入 在Web开发中,我们经常…

    2026年5月10日
    000
  • Python递归函数追踪与性能考量:以序列打印为例

    本文深入探讨了Python中一种递归打印序列元素的方法,并着重演示了如何通过引入缩进参数来有效追踪递归函数的执行流程和参数变化。通过实际代码示例,文章揭示了递归调用可能带来的潜在性能开销,特别是对调用栈空间的需求,以及Python默认递归深度限制可能导致的错误,为读者提供了理解和优化递归算法的实用见…

    2026年5月10日
    000
  • python中zip函数详解 python多序列压缩zip函数应用场景

    zip函数的应用场景包括:1) 同时遍历多个序列,2) 合并多个列表的数据,3) 数据分析和科学计算中的元素运算,4) 处理csv文件,5) 性能优化。zip函数是一个强大的工具,能够简化代码并提高处理多个序列时的效率。 在Python中,zip函数是一个非常有用的工具,它能够将多个可迭代对象打包成…

    2026年5月10日
    000
  • 谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧谷歌浏览器如何截图 谷歌浏览器页面截图技巧

    使用谷歌浏览器的开发者工具截图步骤:1. 按ctrl+shift+i(windows/linux)或cmd+option+i(mac)打开开发者工具。2. 点击右上角三个点,选择”更多工具”,再选择”截图”。3. 选择截取整个页面。推荐的谷歌浏览器扩展…

    2026年5月10日 用户投稿
    100
  • Python中怎样使用pymongo?

    在python中使用pymongo可以轻松地与mongodb数据库进行交互。1)安装pymongo:pip install pymongo。2)连接到mongodb:from pymongo import mongoclient; client = mongoclient(‘mongod…

    2026年5月10日
    000
  • JS如何实现迭代器?迭代器协议

    JavaScript中实现迭代器需遵循可迭代协议和迭代器协议,通过定义[Symbol.iterator]方法返回具备next()方法的迭代器对象,从而支持for…of和展开运算符;该机制统一了数据结构的遍历接口,实现惰性求值,适用于自定义对象、树、图及无限序列等复杂场景,提升代码通用性与…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信