Python正则表达式查找和替换inplace

6

我有一个代码片段可以找到像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

输入文件不包含像 1.321234123 这样的数字。 - falsetru
好的,我改了。 - user1767754
3个回答

7
使用 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可以接受一个函数作为替换值。它将被调用与匹配对象,函数的返回值将用作替换字符串。

下面是稍微修改过的版本,使用了捕获组(用于在替换函数中使用)。

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

但是"foundValue"只是一个占位符,我想要表示实际匹配并希望进行编辑。 - user1767754
@user1767754,我已经相应地更新了答案。请查看一下。 - falsetru
@user1767754,您是否想将1e-10替换为0.0000,将1e10替换为10000000000.0000 - falsetru

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

我希望这就是你要找的。


0
num_decimal_places = 2
re.sub(r"(\d+)(\.\d{1,num_decimal_places})\d*", r"\1\2", line.rstrip())

\1\2 捕获两组括号中的匹配项。这不是四舍五入,而是截断处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接