代码之家  ›  专栏  ›  技术社区  ›  JAT86

在Python中使用regex递归地替换某些行

  •  1
  • JAT86  · 技术社区  · 7 年前

    我有一个文本文件,希望递归地替换包含一些regex模式的所有行,然后将结果保存到一个新的文本文件中。输入文本文件包含以下内容:

    
    NAME1   184,743 184,439 14,305
    
    
    
    NAME2   84,343  64,437  36,335
    
    
    
    
    NAME3   154,543 174,439 38,385
    
    
    
    

    我想用上面的非空行填充所有空行(包括只有制表符和/或空格的行)。最终输出应如下所示:

    
    NAME1   184,743 184,439 14,305
    NAME1   184,743 184,439 14,305
    NAME1   184,743 184,439 14,305
    NAME1   184,743 184,439 14,305
    NAME2   84,343  64,437  36,335
    NAME2   84,343  64,437  36,335
    NAME2   84,343  64,437  36,335
    NAME2   84,343  64,437  36,335
    NAME2   84,343  64,437  36,335
    NAME3   154,543 174,439 38,385
    NAME3   154,543 174,439 38,385
    NAME3   154,543 174,439 38,385
    NAME3   154,543 174,439 38,385
    

    我试过这段代码,但我不知道如何使它工作,因为我是新的Python。正则表达式在Notepad++中工作,但在IDLE中不工作:

    import re
    fhand = open("/home/user1/Documents/inputtext.txt")
    fout = open("/home/user1/Documents/outputtext.txt","w")
    
    for line in fhand:
        re.sub("^(\S+.*)$(\n)^([\t ]+|)$","\1\2\1",line)
        fout.write(line)
    fout.close()
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   blhsing    7 年前

    您可以使用一个简单的循环来跟踪最后一行,其中包含任何非空格:

    last = '\n'
    for line in fhand:
        # if the line isn't empty after stripping all whitespaces
        if line.strip():
            # save this line into the variable last for later blank lines to copy from
            last = line
        # otherwise it's a blank line
        else:
            # and we should copy from the non-blank line saved in the variable last
            line = last
        fout.write(line)
    fout.close()