【问题标题】:Truncate all numbers in a string to one decimal except in certain circumstances除某些情况外,将字符串中的所有数字截断为小数点后一位
【发布时间】:2018-10-13 10:54:50
【问题描述】:

我目前正在用这种方式格式化字符串:

import re    
res = re.sub(r'\d+\.\d{1,}', lambda m: format(float(m.group(0)), '.1f'), res)

这会将所有数字截断到小数点后一位。我想在这里放一个例外,只有当数字后面没有字母l时才应该这样做。例如,'Yesterday I drank 8.567 coke bottles of 0.85L' 将被格式化为 'Yesterday I drank 8.5 coke bottles of 0.85L

仍在为正则表达式苦苦挣扎...

【问题讨论】:

    标签: python regex string python-3.x


    【解决方案1】:
    import re    
    res = re.sub(r'\d+\.\d+(?![lL\d])', lambda m: format(float(m.group(0)), '.1f'), res)
    #                      ^^^^^^^^^^
    

    DEMO

    【讨论】:

    • 这不匹配0.80.85L 吗?您可能需要以 \b 结束模式。
    • 非常感谢!你能解释一下你的答案中的正则表达式吗?它似乎将以 L 结尾的数字缩短为两位小数,而不是只保留它们。为什么会这样?
    • @Lugo - 你知道regex101.com 吗?将任何正则表达式粘贴到里面,你就会(在右侧)得到模式的解释。您还可以针对您在下方文本输入字段中输入的不同文本测试正则表达式。您也可以尝试替换,但只能针对普通文本,而不是 python 代码:)
    • @AhmedAbdelhameed:是的,你完全正确。固定。我给你我的投票;)
    【解决方案2】:

    fails 等输入的当前答案0.8885L。您可以使用以下内容:

    import re
    res = re.sub(r'\d+\.\d+(?![L\d])', lambda m: format(float(m.group(0)), '.1f'), res, flags=re.I)
    

    对您的正则表达式所做的更改:

    • {1,} 替换为 +,因为他们做同样的事情。
    • 添加了negative Lookahead(?![L\d]),意思是“后面不跟字母L或数字”。
    • 添加了标志re.I,意思是“忽略大小写”。

    Try it online.

    注意:如果您不想应用 re.I 标志,可以改用以下模式:

    \d+\.\d+(?![Ll\d])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 2021-08-24
      相关资源
      最近更新 更多