在python中使用正则表达式搜索浮点数,并将其替换为字符串中降低的浮点精度?

时间:2018-12-13 04:38:22

标签: python regex

很抱歉,如果这个问题已经得到回答-我尝试查找它,但是也许我的搜索字词(与我的标题一样)是错误的。

假设我有一个这样的字符串,但我无法控制它:

astr = "A 5.02654824574 (14.710000000000008, -19.989999999999995, -0.8) <-> s[10]: A 5.02654824574 (-29.11999999999999, 52.78, -0.8)"

我想处理该字符串,以便以任意数量的浮点精度显示其中的浮点数-例如3个小数。由于这可以在字符串级别进行,所以我不希望该过程考虑到正确的舍入-只是为了除去小数点字符串字符。

根据Python: Extract multiple float numbers from string,我知道我可以做到:

import re
p = re.compile(r'\d+\.\d+')
for i in p.findall(astr): print i

...打印:

5.02654824574
14.710000000000008
19.989999999999995
0.8
5.02654824574
29.11999999999999
52.78
0.8

....但是,我迷路了在搜索和替换中需要进行哪些正则表达式捕获,所以-例如,对于n_float_precision_decimals = 4-我会将此字符串作为输出(带有上面的字符串作为输入):

"A 5.0265 (14.7100, -19.9899, -0.8) <-> s[10]: A 5.0265 (-29.1199, 52.78, -0.8)"

因此,基本上,正则表达式将考虑到,如果已经存在较小数目的小数,则根本不会截断小数。

是否可以通过单个re.sub操作来完成,而不必如上所述编写显式的for循环并手动构造输出字符串?

1 个答案:

答案 0 :(得分:0)

知道了-多亏Reduce float precision using RegExp in swift(仅在我输入完整个问题后(在此期间,我得到的与该特定问题无关的所有结果):)才在SO建议中弹出) :

>>> pat=re.compile(r'(\d+\.\d{2})\d+')
>>> pat.sub(r'\1', astr)
'A 5.02 (14.71, -19.98, -0.8) <-> s[10]: A 5.02 (-29.11, 52.78, -0.8)'

...或:

>>> nfloatprec=4
>>> pat=re.compile(r'(\d+\.\d{'+str(nfloatprec)+'})\d+')
>>> pat.sub(r'\1', astr)
'A 5.0265 (14.7100, -19.9899, -0.8) <-> s[10]: A 5.0265 (-29.1199, 52.78, -0.8)'