У меня есть фрагмент, который находит числа с плавающей запятой, такие как 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
4
user1767754 16 Дек 2015 в 04:44

3 ответа

Лучший ответ

Используйте fileinput.FileInput с {{X1} } . напечатанная строка будет использоваться в качестве строки замены для каждой строки.

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())
6
Murphy 30 Апр 2018 в 11:12
num_decimal_places = 2
re.sub(r"(\d+)(\.\d{1,num_decimal_places})\d*", r"\1\2", line.rstrip())

\1\2 фиксирует совпадения в двух наборах скобок. Это не округляется, но будет усекать

0
whunterknight 16 Дек 2015 в 02:18
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

Я надеюсь это то, что ты ищешь

1
aeros 16 Дек 2015 в 02:12