将字符串中的所有数字截断为一个小数,除非在某些情况下

时间:2018-10-13 10:54:50

标签: python regex string python-3.x

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

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

仍在努力使用正则表达式...

2 个答案:

答案 0 :(得分:3)

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

DEMO

答案 1 :(得分:1)

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

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