python str()函数在处理浮点数时的一个特性
起因是在做正则匹配匹配浮点数的时候发现有一些数据无法匹配成功:
rec = re.compile(r'^[1-9]\d*\.\d*|0\.\d*[1-9]$')
s = [0.0001, 0.00001, 0.12165, 0.000, 0.0000, 1.00000000]
[i for i in s if rec.match(str(i))] # 输出:[0.0001, 0.12165, 1.0]
1 e − 4 1e-4 1e−4还能匹配成功,但是 1 e − 5 1e-5 1e−5就失败了
之后尝试打印str()
函数处理相关数据的结果:
for i in s:
print(i, end = ', ')
# 输出:0.0001, 1e-05, 0.12165, 0.0, 0.0, 1.0,
结论
在处理 0.00001 0.00001 0.00001这类可以换算成科学计数法的数据时,python会将其换算成 1 e − 5 1e-5 1e−5,可能导致正则匹配失效。
后续
rec = re.compile(r'^[1-9]\d*\.\d*|0\.\d*[1-9]$')
s = [0.0001, 0.000011]
[i for i in s if rec.match(str(i))] # 输出:[0.0001, 1.1e-05]
0.000011 0.000011 0.000011可以匹配成功,似乎是匹配到了正则表达式|
的左半部分。