如何获取正则模式匹配的数据列表?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
相关产品推荐
相关产品推荐

