文件中的文本替换为正则表达式。如何将更改写入文件?---问题扩展

问题描述 投票:0回答:1

Reference

这是一个Cesiumjs特定的file.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")

谢谢你提前帮助你

python regex cesium
1个回答
0
投票

问题是用于替换字符串副本的代码line = line.replace(res.group(1), numberelev)使用res.group(1),它在range(len(line))迭代期间不会改变,因为它在循环之前被初始化:所以,你编码找到所有出现但只替换第一个出现。

为了解决问题,您应该更改body循环,如下所示:

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)(对于每一行只假定模式第一次出现的值)。

我希望这对你有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.