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

相关推荐

  • 如何解决本地图片在使用 mask JS 库时出现的跨域错误?

    如何跨越localhost使用本地图片? 问题: 在本地使用mask js库时,引入本地图片会报跨域错误。 解决方案: 要解决此问题,需要使用本地服务器启动文件,以http或https协议访问图片,而不是使用file://协议。例如: python -m http.server 8000 然后,可以…

    2025年12月24日
    200
  • 移动端 CSS 中如何实现标签边框包裹垂直居中效果?

    移动端 css 中还原标签边框包裹垂直居中的设计难题 设计稿中常见的边框包裹文字,文字垂直左右居中的效果,在移动端实现时往往会遇到意想不到的难题,尤其是在安卓和苹果系统下的显示不一致问题。如何解决这一问题,还原设计稿中的视觉效果? 解决方案 flex 布局 立即学习“前端免费学习笔记(深入)”; f…

    2025年12月24日
    200
  • 使用 Mask 导入本地图片时,如何解决跨域问题?

    跨域疑难:如何解决 mask 引入本地图片产生的跨域问题? 在使用 mask 导入本地图片时,你可能会遇到令人沮丧的跨域错误。为什么会出现跨域问题呢?让我们深入了解一下: mask 框架假设你以 http(s) 协议加载你的 html 文件,而当使用 file:// 协议打开本地文件时,就会产生跨域…

    2025年12月24日
    200
  • 移动端如何实现标签效果:边框包裹文字,垂直左右居中?

    如何在移动端还原设计稿中的小标签效果:边框包裹文字,垂直左右居中? 在移动端还原设计稿中的小标签效果,例如边框包裹文字,文字垂直左右居中,是一项常见的挑战。使用传统的 css 方式往往会出现垂直居中不一致的问题。针对这个问题,有两种推荐的方式: flex 布局 flex 布局提供了一种更灵活的方法来…

    2025年12月24日
    200
  • 移动端小标签如何完美实现垂直居中?

    在移动端还原设计稿中的小标签垂直居中样式 在移动端还原设计稿中的小标签效果时,常常会遇到垂直居中不够完美的问题,尤其是安卓和苹果上的效果不一致。本文将探讨两种可行的解决方案来解决这一难题。 解决方案 1:flex 布局 flex 布局是一种现代布局系统,可提供灵活且强大的布局选项。对于小标签垂直居中…

    2025年12月24日
    000
  • CSS 砌体 Catness

    css 就像技术中的其他东西一样 – 它总是在变化和发展。该领域正在进行的开发是 css 网格布局模块级别 3,也称为 css masonry 布局。 theo 制作了一段视频,介绍了它的开发方式以及苹果和谷歌就如何实施它进行的辩论。 所有这些让我很高兴尝试 css 砌体! webkit…

    好文分享 2025年12月24日
    000
  • 苹果浏览器网页背景图色差问题:如何解决背景图不一致?

    网页背景图在苹果浏览器上出现色差 一位用户在使用苹果浏览器访问网页时遇到一个问题,网页上方的背景图比底部的背景图明显更亮。 这个问题的原因很可能是背景图没有正确配置 background-size 属性。在 windows 浏览器中,背景图可能可以自动填满整个容器,但在苹果浏览器中可能需要显式设置 …

    2025年12月24日
    400
  • 苹果浏览器网页背景图像为何色差?

    网页背景图像在苹果浏览器的色差问题 在不同浏览器中,网站的背景图像有时会出现色差。例如,在 Windows 浏览器中显示正常的上层背景图,在苹果浏览器中却比下层背景图更亮。 问题原因 出现此问题的原因可能是背景图像未正确设置 background-size 属性。 解决方案 为确保背景图像在不同浏览…

    2025年12月24日
    300
  • 为什么苹果浏览器上的背景图色差问题?

    背景图在苹果浏览器上色差问题 当在苹果浏览器上浏览网页时,页面顶部背景图的亮度高于底部背景图。这是因为窗口浏览器和苹果浏览器存在兼容性差异所致。 具体原因分析 在窗口浏览器中,页面元素的大小是使用像素(px)来定义的。而苹果浏览器中,使用的是逻辑像素(css像素)来定义元素大小。导致了窗口浏览器和苹…

    2025年12月24日
    000
  • 苹果电脑浏览器背景图亮度差异:为什么网页上下部背景图色差明显?

    背景图在苹果电脑浏览器上亮度差异 问题描述: 在网页设计中,希望上部元素的背景图与页面底部的背景图完全对齐。而在 Windows 中使用浏览器时,该效果可以正常实现。然而,在苹果电脑的浏览器中却出现了明显的色差。 原因分析: 如果您已经排除屏幕分辨率差异的可能性,那么很可能是背景图的 backgro…

    2025年12月24日
    000
  • 正则表达式在文本验证中的常见问题有哪些?

    正则表达式助力文本输入验证 在文本输入框的验证中,经常遇到需要限定输入内容的情况。例如,输入框只能输入整数,第一位可以为负号。对于不会使用正则表达式的人来说,这可能是个难题。下面我们将提供三种正则表达式,分别满足不同的验证要求。 1. 可选负号,任意数量数字 如果输入框中允许第一位为负号,后面可输入…

    2025年12月24日
    000
  • 为什么多年的经验让我选择全栈而不是平均栈

    在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

    2025年12月24日
    000
  • 姜戈顺风

    本教程演示如何在新项目中从头开始配置 django 和 tailwindcss。 django 设置 创建一个名为 .venv 的新虚拟环境。 # windows$ python -m venv .venv$ .venvscriptsactivate.ps1(.venv) $# macos/linu…

    2025年12月24日
    000
  • 花 $o 学习这些编程语言或免费

    → Python → JavaScript → Java → C# → 红宝石 → 斯威夫特 → 科特林 → C++ → PHP → 出发 → R → 打字稿 []https://x.com/e_opore/status/1811567830594388315?t=_j4nncuiy2wfbm7ic…

    2025年12月24日
    000
  • css怎么设置文件编码

    在css中,可以使用“@charset”规则来设置编码,语法格式“@charset “字符编码类型”;”。“@charset”规则可以指定样式表中使用的字符编码,它必须是样式表中的第一个元素,并且不能以任何字符开头。 本教程操作环境:windows7系统、CSS3&&…

    2025年12月24日
    000
  • 实例讲解如何用CSS语言创作一根闪电连接线

    效果预览 按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。 https://codepen.io/comehope/pen/RBjdzZ 可交互视频 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。 请用 chrome, safari, edge 打开观看。 立即学习“…

    2025年12月24日
    000
  • 响应式HTML5按钮适配不同屏幕方法【方法】

    实现响应式HTML5按钮需五种方法:一、CSS媒体查询按max-width断点调整样式;二、用rem/vw等相对单位替代px;三、Flexbox控制容器与按钮伸缩;四、CSS变量配合requestAnimationFrame优化的JS动态适配;五、Tailwind等框架的响应式工具类。 如果您希望H…

    2025年12月23日
    000
  • html5怎么导视频_html5用video标签导出或Canvas转DataURL获视频【导出】

    HTML5无法直接导出video标签内容,需借助Canvas捕获帧并结合MediaRecorder API、FFmpeg.wasm或服务端协同实现。MediaRecorder适用于WebM格式前端录制;FFmpeg.wasm支持MP4等格式及精细编码控制;服务端方案适合高负载场景。 如果您希望在网页…

    2025年12月23日
    300
  • 如何查看编写的html_查看自己编写的HTML文件效果【效果】

    要查看HTML文件的浏览器渲染效果,需确保文件以.html为扩展名保存、用浏览器直接打开、利用开发者工具调试、必要时启用本地HTTP服务器、或使用编辑器实时预览插件。 如果您编写了HTML代码,但无法直观看到其在浏览器中的实际渲染效果,则可能是由于文件未正确保存、未使用浏览器打开或文件扩展名设置错误…

    2025年12月23日
    400
  • html5怎么加php_html5用Ajax与PHP后端交互实现数据传递【交互】

    HTML5不能直接运行PHP,需通过Ajax与PHP通信:前端用fetch发送请求,PHP接收处理并返回JSON,前端解析响应更新DOM;注意跨域、编码、CSRF防护和输入过滤。 HTML5 本身是前端标记语言,不能直接运行 PHP 代码,但可以通过 Ajax(异步 JavaScript)与 PHP…

    2025年12月23日
    300

发表回复

登录后才能评论
关注微信