文件中的文本被正则表达式替换。 How to write the change into file?---问题扩展
Text in a file replaced by regex. How to write the change into file?---Question extended
这是 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")
提前感谢你的帮助,约瑟夫
问题是用于替换字符串出现的代码 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)
( 对于每一行 只假定值你的模式第一次出现)。
希望对您有所帮助!
这是 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")
提前感谢你的帮助,约瑟夫
问题是用于替换字符串出现的代码 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)
( 对于每一行 只假定值你的模式第一次出现)。
希望对您有所帮助!