首页 > 解决方案 > 在使用正则表达式搜索功能在 Python 中解析的多个 if 和 for 语句之后未定义变量

问题描述

我正在用 Python 解析几个文本文件,以便找到一遍又一遍地重复的代码块。目的是将不同文件的相似代码块合并到另一个文件中。

因此,我需要扫描文本文件,通过使用正则表达式搜索找到感兴趣的块,然后将其开始和结束的行存储在原始文本文件中。最后,我可以将该代码块写入另一个文件,使用“开始行和结束行”作为边界。

下面的代码摘录是我描述的这个主要代码的一部分,但变量“layer_end”没有被定义。有什么建议么?

    with open(f_path, 'r') as gcode: # Opening each file separately
        for i, line in enumerate(gcode.readlines()): # Searching for the beginning of given layer
            if rgx_start.search(line):
                start_i = prev_start[cube_i]
                print(start_i)
                if i > start_i:
                    layer_start = i + 2
                    break
        for i, line in enumerate(gcode.readlines()):  # Searching for the end of given layer
            if rgx_end.search(line):
                if i > layer_start:
                    layer_end = i - 2
                    break
        for i, line in enumerate(gcode.readlines()):
            if i in range(layer_start, (layer_end + 1)):  # Writing the code of that given layer
                final_code.write(line)
        prev_start.append(layer_start)
        print(prev_start)
        prev_end.append(layer_end)

标签: pythonregexlistparsingfor-loop

解决方案


readlines每个打开的文件只能调用一次。start_i在 for 循环内永远不会改变,因为内部if是唯一的,如果 i 大于某个值,你可以从这个元素开始。

with open(f_path, 'r') as gcode: # Opening each file separately
    lines = gcode.readlines()

start_i = prev_start[cube_i]
for i, line in enumerate(lines[start_i+1:]): # Searching for the beginning of given layer
    if rgx_start.search(line):
        layer_start = start_i + i + 3
        break
for i, line in enumerate(lines[layer_start+1:]):  # Searching for the end of given layer
    if rgx_end.search(line):
        layer_end = layer_start + i - 1
        break
final_code.write(lines[layer_start:layer_end + 1)
prev_start.append(layer_start)
print(prev_start)
prev_end.append(layer_end)

推荐阅读