2011-08-18 42 views
0

我想在某个标记之后复制行数一定次数。如何复制Python脚本中的标记之后的行?

如果我有一个文本文件,如下所示:

##TextLines## 
Hi 
Hello 
##TextLines## 

我如何擦除标记,一次复制的订单?

最终文本文件看起来像:

Hi 
Hello 
Hi 
Hello 

现在,我有一个正则表达式查找标签和一个空白的换行符替换它们。我知道大多数逐行读取是在打开文件后使用for循环完成的。但是,我不想处理特定的行读取,但行后。有任何想法吗?

编辑:可能有多个标记和未标记的文本。例如:

Hi 
##CopyLine1## 
Hello 
##CopyLine1## 
Greetings 
##CopyLine2## 
Howdy 
##CopyLine2## 
Hola 

将成为:

Hi 
Hello 
Hello 
Greetings 
Howdy 
Howdy 
Hola 
+0

你的问题不是很精确。标签线是否像打开和关闭的刹车片一样使用?如果在第一个采样行之前和/或最后一行之后有一些文本,输出应该如何显示? – Achim

+0

是的,这些标签就像打开和关闭的括号。如果之前或之后有文本,它仍应写入新文件,但只能写入一次。 –

回答

1

这应该做的工作

import re 
regex = re.compile("^##.*##\n$") 
out = open("result.txt","w") 
matchfound = True 
inmatch =False 
for line in open('myfile.txt'): 
    if regex.match(line): 
     matchfound = True 
    else: 
     matchfound = False 
    if matchfound and not inmatch: 
     inmatch = True 
     content = [] 
    elif matchfound and inmatch: 
     inmatch = False 
     out.write ("".join(content)) 
    elif inmatch: 
     content.append(line) 
     out.write(line) 
    else: 
     out.write(line) 
out.close() 
+0

这非常接近我最终使用的。 –

0
def isTag(line): 
    return line.startswith('##') 

class LineHandler(object): 
    def normalLine(self,line): 
     if isTag(line): 
      self.lineHandler = self.insideTag 
     else: 
      print line 

    def insideTag(self,line): 
     if isTag(line): 
      self.lineHandler = self.normalLine 
     else: 
      print line 
      print line 

    def __init__(self,path): 
     self.lineHandler = self.normalLine 
     for line in file(path): 
      self.lineHandler(line.strip()) 

LineHandler('lines.txt') 
+0

这个程序看起来很漂亮,但是它立即重复标签内的线条,并且原始海报要求按块重复 –

相关问题