Текст в файле заменен на регулярное выражение.Как записать изменение в файл? --- Вопрос расширен - PullRequest
0 голосов
/ 14 февраля 2019

Ссылка

Это специфический файл caesiumjs.czml.Он содержит возвышения в метрах.Это 1407.0 и 1408.2 и 1409.6 --- и так далее.Высота в двух линиях.

var czml = [{
"id" : "document",
"name" : "CZML Geometries: Polyline",
"version" : "1.0"
}
,

{snip---"cartographicDegrees": [0, 12.039186, 47.663944, 1407.0, 30.0, 12.038963, 47.663952, 1408.2, 60.0, 12.038646, 47.663924, 1409.6, 90.0, 12.038504, 47.663926, 1412.2, 120.0, snip---}
,
{
{snip--- "cartographicDegrees": [0, 12.035275, 47.661445, 1557.2, 30.0, 12.035461, 47.661414, 1550.4, 60.0, 12.03565, 47.661382, 1551.4, 90.0, 12.035831, 47.661391, 1546.6, 120.0, snip---}];

Я хочу добавить 40 к каждой из них, поэтому результат должен быть в обеих строках: 1447,0 вместо 1407,0, 1448,2 вместо 1408,0, 1449,6 вместо 1409,6 -- и так далее.Но мой код меняет только первое значение - 1407.0 на 1447.0 - в каждой строке.

Что не так в моем следующем коде Python?

import re
f1 = input("name of your CZML file---> ")
input_file = open(f1,'r+')
output_file = open(f1 + '_output', 'w+')
line = input_file.readline()
while line:
    res = re.search(r"([0-9]{4}\.[0-9]{1,})", line)
    #res = re.findall(r"([0-9]{4}\.[0-9]{1,})", line)   
    for i in range(len(line)):
        number = line[i : (i+6)]
        if re.search(r"([0-9]{4}\.[0-9]{1})", number):
            number=float(number)
            numberelev = number+40
            numberelev=str(numberelev)
        line = line.replace(res.group(1), numberelev)
    output_file.write(line)
    line = input_file.readline()
input_file.close()
output_file.close()
print("OK")

Заранее спасибо за вашепомогите, Иосиф

1 Ответ

0 голосов
/ 14 февраля 2019

Проблема в том, что код, используемый для замены вхождений строк, line = line.replace(res.group(1), numberelev), использует res.group(1), который не изменяется во время итерации по range(len(line)), поскольку он инициализируется до цикла:Итак, ваш код находит все вхождения, но заменяет только первое.

Чтобы устранить проблему, вы должны изменить тело цикла следующим образом:

for i in range(len(line)):
    number = line[i : (i+6)]
    find = re.search(r"([0-9]{4}\.[0-9]{1})", number)
    if find:
        number=float(number)
        numberelev = number+40
        numberelev=str(numberelev)
        line = line.replace(find.group(1), numberelev)

Ключевой момент заменяет find.group(1) (который изменяется при продолжении цикла), а не res.group(1) (который для каждой строки предполагает только значение первого вхождения вашего паттерна).

Я надеюсь, что это может бытьполезно для вас!

...