0

我已经检查并使用了各种示例,看来我的问题比我能找到的要复杂一些。我需要做的是搜索特定字符串,然后删除以下行并继续删除行,直到找到另一个字符串。所以一个例子如下:

a
b
color [
0 0 0,
1 1 1,
3 3 3,
] #color
y
z

这里,"color ["是match1,"] #color"是match2。那么需要的是以下内容:

a
b
color [
] #color
y
z
4

3 回答 3

2

这个“简单易懂”的代码示例将帮助您入门……您可以根据需要对其进行调整。请注意,它逐行处理文件,因此这适用于任何大小的文件。

start_marker = 'startdel'
end_marker = 'enddel'

with open('data.txt') as inf:
    ignoreLines = False
    for line in inf:
        if start_marker in line:
            print line,
            ignoreLines = True
        if end_marker in line:
            ignoreLines = False            
        if not ignoreLines:
            print line,

它使用startdelenddel作为开始和结束忽略数据的“标记”。

更新

根据评论中的请求修改了代码,现在包括/打印包含“标记”的行。

鉴于此输入数据(借自@drewk):

Beginning of the file...
stuff
startdel
   delete this line
   delete this line also
enddel
stuff as well
the rest of the file...  

它产生:

Beginning of the file...
stuff
startdel
enddel
stuff as well
the rest of the file...
于 2012-08-08T00:56:42.973 回答
1

您可以使用 nongreedy 使用单个正则表达式来执行此操作*。例如,假设您想同时保留 the"look for this line""until this line is found"线条,并且只丢弃中间的线条,您可以这样做:

>>> my_regex = re.compile("(look for this line)"+
...                       ".*?"+ # match as few chars as possible
...                       "(until this line is found)",
...                       re.DOTALL)
>>> new_str = my_regex.sub("\1\2", old_str)

几点注意事项:

  • re.DOTALL标志告诉 Python “.”。可以匹配换行符——默认匹配除换行符以外的任何字符
  • 括号定义了“编号匹配组”,然后在我说“\1\2”时使用它,以确保我们不会丢弃第一行和最后一行。如果您确实想丢弃其中一个或两个,那么只需去掉 \1 和/或 \2。例如,保留第一次但不是最后一次使用my_regex.sub("\1", old_str);或摆脱两者的使用my_regex.sub("", old_str)

如需进一步解释,请参阅:http ://docs.python.org/library/re.html或在您喜欢的搜索引擎中搜索“非贪婪正则表达式”。

于 2012-08-08T00:57:26.063 回答
1

这有效:

s="""Beginning of the file...
stuff
look for this line
   delete this line
   delete this line also
until this line is found
stuff as well
the rest of the file...  """

import re

print re.sub(r'(^look for this line$).*?(^until this line is found$)',
            r'\1\n\2',s,count=1,flags=re.DOTALL | re.MULTILINE)

印刷:

Beginning of the file...
stuff
look for this line
until this line is found
stuff as well
the rest of the file... 

您还可以使用列表切片来执行此操作:

mStart='look for this line'
mStop='until this line is found'
li=s.split('\n')
print '\n'.join(li[0:li.index(mStart)+1]+li[li.index(mStop):])

相同的输出。

我喜欢re这个(本质上是一个 Perl 人......)

于 2012-08-08T01:11:31.627 回答