Python正则表达式在内部找到并替换

时间:2015-12-16 01:44:54

标签: python regex

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

3 个答案:

答案 0 :(得分:5)

使用fileinput.FileInputinplace=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捕获两组括号中的匹配项。这不会圆,但会截断