我有一个片段,可以找到像 1.321234123 这样的浮点数。我想摆脱一些精确度,并使 1.3212 。但是我如何访问找到的匹配项,将其转换并替换它?
Python来源:
import fileinput
import re
myfile = open("inputRegex.txt", "r")
for line in myfile:
line = re.sub(r"[+-]? *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?", "foundValue", line.rstrip())
print(line)
输入文件:
4.2abc -4.5 abc - 1.321234123 abc + .1e10 abc . abc 1.01e-2 abc
1.01e-.2 abc 123 abc .123
答案 0 :(得分:5)
使用fileinput.FileInput
和inplace=True
。打印行将用作每行的替换字符串。
myfile = fileinput.FileInput("inputRegex.txt", inplace=True)
for line in myfile:
line = re.sub(r"[+-]? *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?",
"foundValue",
line.rstrip())
print(line)
<强>更新强>
re.sub
可以接受函数作为替换。它将使用match对象调用,函数的返回值将用作替换字符串。
以下是略微修改的版本以使用捕获的组(用于替换功能)。
line = re.sub(r"([+-]? *)(\d+(?:\.\d*)?|\.\d+)([eE][+-]?\d+)?",
lambda m: m.group(1) + re.sub('(\..{4}).*', r'\1', m.group(2)) + (m.group(3) or ''),
line.rstrip())
答案 1 :(得分:1)
import fileinput
import re
myfile = open("inputRegex.txt", "r")
def changePrecision(matchObj):
return str(round(float(matchObj.group(0).replace(" ","")),4))
for line in myfile:
newLine = re.sub(r"[+-]? *(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?", changePrecision, line)
print newLine
我希望这就是你要找的东西
答案 2 :(得分:0)
num_decimal_places = 2
re.sub(r"(\d+)(\.\d{1,num_decimal_places})\d*", r"\1\2", line.rstrip())
\1\2
捕获两组括号中的匹配项。这不会圆,但会截断