我有一个 vrml (wrl) 文件,我需要从中删除一些文本。要删除的文本块可以由 match1 和 match2 标识。
要删除的文本块应该来自 match1,直到但不包括 match2。注意 match1 也应该被排除在删除之外。
因此,给定以下内容,其中 match1 是“color [”,而 match2 是“] #color”:
...
a
b
color [
0 0 0
0 0 0
0 0 0
] #color
c
d
...
使用 Levon 提供的以下代码:
with open('try1a.wrl') as inf:
ignoreLines = False
for line in inf:
if 'color [' in line:
print line,
ignoreLines = True
if '] #color' in line:
ignoreLines = False
if not ignoreLines:
print line,
我得到以下信息:
a
b
color [
] #color
c
d
这正是我想要的。
但是,我发现存在另一组这些文本块,它们分别以 match1 和 match2 开头和结尾,不应删除。我要删除的块和我不想删除的块之间的区别在于 match1 后面的行。
因此,如果代码看到以下内容,它应该越过这个卡盘而不删除任何东西,然后继续下一个:
...
a
b
color [
0 0 1 # since this is not "0 0 0" the code should leave this unchanged
0 0 0
0 0 0
] #color
c
d
...
总而言之,如果代码在 match1 之后看到“0 0 0”,则删除 match2 之前的所有行(代码当前可以正常工作),但如果代码没有看到“0 0 0”,请不要理会它并移动到下一个。后一种功能需要添加到 Levon 提供的代码中。顺便感谢 Levon 的代码!
编辑:
这是成品,效果很好,再次感谢所有帮助过我的人:
import string
import sys
import re
import subprocess
file_name_in = sys.argv[1]
file_name_out = sys.argv[2]
f = file(file_name_out, 'w')
sys.stdout = f
with open(file_name_in) as inf:
ignoreLines = False
for line in inf:
if 'color [' in line:
print line,
line = next(inf, '')
ignoreLines = all((s == '0' or s == '0,') for s in line.split())
if '] #color' in line:
ignoreLines = False
if not ignoreLines:
print line,
sys.stdout = sys.__stdout__
f.close()
# remlns8.py inputFile.wrl outputFile.wrl