正则表达式匹配整数与浮点数失败与解决方案
- 问题描述
- 问题分析
- 解决方案
- 总结
问题描述
在处理数据的时候需要提取文本内整数与浮点数,这个时候想到使用正则表达式,咨询百度文心一言给出以下方案及参考代码
import re text = "我有100元,还有2.5元,以及0.75元和1000元。"
# 使用正则表达式匹配数字(整数或浮点数)
#\d+:匹配一个或多个数字(整数部分)。
#(\.\d+)?:一个可选的组,用于匹配小数点(\.)后跟一个或多个数字(小数部分)。整个组(包括小数点和数字)是可选的,由?指定。
numbers = re.findall(r'\d+(\.\d+)?', text) print(numbers) # 输出: ['100', '2.5', '0.75', '1000']
百度文心一言除了给参考代码,还很贴心的备注了输出结果,然而实际运行后输出的结果却与预期完全不一样,匹配出的数字列表的长度是正确的,但整数及浮点数前的数字都为空,请见下图:
通过正则表达式在线测试平台测试给的正则表达式,提供的参考代码是能正常运行的,与给的参考代码输出结果一致
问题分析
之后在百度查找原因,貌似没有出现相同情况的朋友,尝试重装re正则表达式模块通知是python默认模块,不用也不能重新安装。只能尝试搜索其他正则表达式方案,大多数人给的方案与上述方案一致,或者干脆分别提取整数和提取浮点数后合并在一起,这并不是我想要的结果。
解决方案
虽然分别提取整数和浮点数再合并并不是我想要的结果,但是给我提供了思路,可以用或方式匹配整数或浮点数,代码如下:
import retext = "价格是123.45元,有时是123元,或者像0.45这样"# 匹配浮点数或整数,注意这里需先匹配浮点数再匹配整数
num1 = re.findall(r'\d+\.\d+|\d+', text)
print(num1) # 输出: ['123.45', '123', '0.45']# 错误示范,匹配整数或浮点数,这样会将浮点数拆成两个整数
num2 = re.findall(r'\d+|\d+\.\d+', text)
print(num2) # 输出: ['123', '45', '123', '0', '45']
运行结果
总结
上述方法算不上高明,只是我确实不知道为啥别人及正则表达式在线测试平台都能正常匹配的代码在我这就失效了,只能自己想个笨办法,对了,我使用的python版本为Python 3.12.0,也可能是我版本或者安装过程出现问题了,如果有哪位大神清楚原因,请给我答疑解惑下,感激不尽。