当python中有多个匹配项时,删除两个模式之间的行

2024-05-12 15:17:47 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我的输入文件如下所示:

lines
BeginModeData apple
lines
EndModuleData
BeginModeData banana
lines
EndModuleData
BeginModeData orange
lines
EndModuleData
...

我喜欢删除属于“香蕉”的所有行,所以它看起来像这样:

^{pr2}$

现在,我的python代码几乎可以工作了,但它也可以是任何其他“EndModuleData”,这不是我想要的:

linelist = open("infile.txt").readlines()
newfile = open('outfile', 'w')
flag = 1

for line in linelist:
    if line.startswith("BeginModeData banana"):
        flag = 0
    if line.startswith("EndModuleData"):
        flag = 1
    if flag and not line.startswith("EndModuleData"):
       newfile.writelines(line)

如何改进我的小代码以使其工作?谢谢你的帮助。在


Tags: 文件代码appleiflineopenflagbanana
2条回答

您可以在一个字符串中读取整个文件,并使用Python的regex模块^{}替换整个模式:

s = open("infile.txt").read()  # read everything into a single multiline string
newfile = open('outfile', 'w')

new_s = re.sub('BeginModeData banana(\n.*?)*?\nEndModuleData\n', '', s, flags=re.MULTILINE)
# match the replacement pattern non-greedily (*?) not to match all the way to the end

new_file.write(new_s)
new_file.close()

试试这个:

flag = 1

for line in linelist:
    if line.startswith("BeginModeData banana"):
        flag = 0
    if flag:
        newfile.write(line)
    if line.startswith("EndModuleData"):
        flag = 1

另外,在处理文件对象时,最好使用with关键字。这样做的好处是,文件在其套件完成后会正确关闭,即使在此过程中引发了异常:

^{pr2}$

相关问题 更多 >