删除python中的特定字符串和特定空行

删除python中的特定字符串和特定空行,python,string,text,Python,String,Text,我正在删除文本文件中的特定字符串和空行,下面是我前面的问题。。。我指的是我们的SO专家提供的一些示例和解决方案。。。它可以通过移除字符串而不是空行来很好地工作。为了便于理解,我在这里强调了这个问题 文本文件的某些部分包含stringA、stringB和stringC行,并且在其下方还有空行,仅删除其下方的一行 line0 line1 stringAxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line2 stringBxxxxxxxxxxxx

我正在删除文本文件中的特定字符串和空行,下面是我前面的问题。。。我指的是我们的SO专家提供的一些示例和解决方案。。。它可以通过移除字符串而不是空行来很好地工作。为了便于理解,我在这里强调了这个问题

文本文件的某些部分包含stringA、stringB和stringC行,并且在其下方还有空行,仅删除其下方的一行

line0
line1      stringAxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line2                stringBxxxxxxxxxxxxxxxxxxxxxxx
line3        stringCxxxxxxxxxxxxxxxxxxx 
line4
line5
line6  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line7  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line8  
line9  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line10 textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line11               stringBxxxxxxxxxxxxxxxxxxxxxxx
line12       stringCxxxxxxxxxxxxxxxxxxx  
line13
line14
line15  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line16  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line17 
line18  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line19  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line20
line21  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line22  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line23 
line24  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line25  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line26               stringBxxxxxxxxxxxxxxxxxxxxxxx
line27       stringCxxxxxxxxxxxxxxxxxxx  
line28
line29
line30  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line31  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line32  
在这种情况下,删除包含任何stringA、stringB、stringC和其后一行的任何行。例如,拆下管路1,2,3,4拆下管路11,12,13拆下管路26,27,28

我尝试过使用strip(),但它删除了所有空行。这是我使用的脚本,它确实删除了包含stringA、stringB和stringC的所有行

filename = 'raw.txt'
with open(filename, 'r') as fin:
    lines = fin.readlines()
with open('clean.txt', 'w') as fout:
   for line in lines:
        if not re.match(r"\s+(stringA|stringB|stringC)", line):
            fout.write(line)
预期产量

line0
line5
line6  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line7  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line8  
line9  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line10 textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line14
line15  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line16  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line17 
line18  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line19  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line20
line21  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line22  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line23 
line24  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line25  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line29
line30  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line31  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line32  

感谢你的帮助和善意的帮助。谢谢。

我很确定这不是最好的答案,但“类似旗帜”的方法很有效:

import re
filename = 'raw.txt'
with open(filename, 'r') as fin:
    lines = fin.readlines()

flag = 0

with open('clean.txt', 'w') as fout:
    for line in lines:
        if not re.match(r'.*(stringA|stringB|stringC)', line):
            if not flag:
                fout.write(line)
            flag = 0
        else:
            flag = 1
希望它有助于优化解决方案:

with open('raw.txt', 'r') as fin, open('clean.txt', 'w') as fout:
    string_c_pat = re.compile(r'\s+stringC')
    pat = re.compile(r"\s+(stringA|stringB|stringC)")

    for line in fin:    # traversing file as iterator 
        if string_c_pat.match(line):
            next(fin)   # skip `stringC` line and jump to next line
        if not pat.match(line):
            fout.write(line)

使用
re.compile()
并保存生成的正则表达式 当使用表达式时,重用对象的效率更高 在一个程序中执行多次


我同意这个解决方案听起来更优化,但您假设它只需要在stringC之后跳过。如果重点是删除字符串A/B或C之后的下一个空行,那么如果我没有删除,则该操作不起作用wrong@Nqsir,我看不出关键行与OP输入中的“stringA、stringB和stringC”有什么不同,OP可能会详细说明,如果这是关键行,我理解问题的方式让我假设:“分隔符应该是任何stringA/B/C”,但我完全同意将分隔符放在stringC上是一个正确的选择。您好,先生…此解决方案有效,但当我想删除顶部和底部的空行时…我收到错误TypeError:“file”对象没有属性“getitem”…我为fin[6:-2]中的行添加了@chenoi,你为什么使用
fin[6:-2]
在这种情况下?您好,先生……您的方法也有效……我以前没有使用过flag……如果您能解释一下,我将不胜感激。。。thanks@chenoi,您好,这里的标志是一个图形化的图像,您正在使用一个类型,大多数情况下是char或int,来表示发生了什么事情。在这种情况下,我使用的是int;无论我是否在写一行,我都会升起我的标志到1,否则我的标志将永久为0。当我的标志等于1时,这意味着我不想在后面写行。这非常常见和有用,尤其是在低级语言中,可能不是最好的选择。我希望我说得更清楚^^^好的……谢谢……这确实让我明白了……至少我知道为什么……谢谢