代码之家  ›  专栏  ›  技术社区  ›  sdaau

在python中使用regex来搜索浮点,并用字符串中降低的浮点精度替换它们?

  •  0
  • sdaau  · 技术社区  · 7 年前

    抱歉,如果这已经得到回答-我试着查找它,但可能我的搜索条件(与我的标题相同)是坏的。

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

    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)"
    

    所以基本上,regex会考虑到,如果已经有少量的小数,它就不会截断小数。

    一次就可以做到吗 re.sub 操作,而不必编写显式 for 循环,并手动构造输出字符串?

    1 回复  |  直到 7 年前
        1
  •  0
  •   sdaau    7 年前

    明白了-多亏了 Reduce float precision using RegExp in swift (只有在我完成整个问题的输入后,才会弹出sosuggestions(在这段时间里,我得到的都是与这个问题无关的结果) :) ):

    >>> 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)'