You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取正则模式匹配的数据列表?re.findall匹配小数异常排查

解决正则匹配十进制数的问题

嘿,我来帮你搞定这个正则匹配的问题~咱们先聊聊你当前用的r'\d\.\d'为啥不好使:这个模式死抠着小数点前后必须各有且仅有一位数字,所以只能匹配2.7这种刚好一位整数一位小数的情况,像.3(只有小数点后有数字)、12.34(多位数字)根本碰不到,更别说整数2了。

先明确需求:你要匹配哪些十进制数?

先理清楚你要提取的范围:

  • 选项1:只抓带小数点的有效小数(比如.3、2.7、123.45,排除纯.这种无效的)
  • 选项2:既要抓小数,也要抓整数(比如2、123)

对应正则方案

方案1:只匹配带小数点的有效小数

用这个正则:r'\d+\.\d*|\d*\.\d+'

  • 拆解开讲:
    • \d+\.\d*:管的是小数点前有至少一位数字,后面可以有0或多位数字的情况(比如2.、2.7、123.45)
    • \d*\.\d+:管的是小数点前可以没有数字,但后面必须有至少一位数字的情况(比如.3、2.7、123.45)
    • 两者用|连起来,就能覆盖所有带小数点的有效小数,还能自动排除纯.这种无效的。

方案2:匹配所有十进制数(整数+小数)

如果需要把整数也包含进来,就用这个正则:r'\d+(\.\d+)?|\.\d+'

  • 解释下:
    • \d+(\.\d+)?:负责匹配整数(比如2)或者带小数部分的整数(比如2.7)
    • \.\d+:负责匹配无前缀数字的小数(比如.3)

修改后的代码示例

我给你调整了代码,用re.fullmatch更合适(因为你的每个数组元素都是单独的字符串,我们要确认整个字符串是一个有效数,而不是从字符串里抠出部分):

import re

str1 = "2.7"
str2 = ".3"
str3 = "."
str4 = "2"
str5 = "sushruth"
x = [str1, str2, str3, str4, str5]
y = []

for a in x:
    # 用fullmatch检查整个字符串是否是有效十进制数
    match_result = re.fullmatch(r'\d+(\.\d+)?|\.\d+', a)
    if match_result:
        y.append(match_result.group())

print(y)
# 输出结果:['2.7', '.3', '2']

要是你的字符串里可能包含多个小数(比如"今天买了2.7斤苹果和.3斤梨"),那换成re.findall就行,正则用r'\d+\.\d*|\d*\.\d+'(不用锚点),这样能把所有符合条件的数都提出来。

额外说明

  • 纯小数点"."会被自动排除,因为它不是有效十进制数
  • 非数字字符串sushruth也会被过滤掉,完全符合你的预期

内容的提问来源于stack exchange,提问作者Sushruth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:13:03