我已经搜索了很多地方,我希望有人能给我指出我错过的链接,或者用这个逻辑帮助我。你知道吗
我们有一个脚本,它从各种设备收集日志,并将它们放在文本文件中。在这些文本文件中有一个时间戳,我们需要收集这个时间戳前后的几行文本。你知道吗
我已经有了一个脚本,可以匹配时间戳并删除某些报告(包括下面)的时间戳,但我无法找出如何匹配时间戳,然后捕获周围的行。你知道吗
regex_time_stamp = re.compile('\d{2}:\d{2}:\d{2}|\d{1,2}y\d{1,2}w\d{1,2}d|\d{1,2}w\d{1,2}d|\d{1,2}d\d{1,2}h')
with open(filename, 'r') as f:
h = f.readlines()
for line in h:
if regex_time_stamp.search(line) is not None:
new_line = re.sub(regex_time_stamp, '', line)
pre_list.append(new_line)
else:
pre_list.append(line)
如有任何帮助,我们将不胜感激!谢谢你花时间读这篇文章。你知道吗
基本算法是记住最近读到的三行。当您匹配一个标题时,请阅读下面的两行,并将其与标题和您保存的最后三行合并。你知道吗
或者,由于您正在保存列表中的所有行,只需跟踪哪个元素是当前元素,当您找到一个标题时,就可以返回并获取前两个和后两个元素。你知道吗
用重复行捕获
同意@Bryan Oakley和@TigerhawkT3的基本算法,但是有一个问题:
如果几行连续匹配呢?
您可以通过打印第一个匹配的最后两行,然后打印第二个匹配的最后两行来复制“上下文”行。。。它实际上还包含前面匹配的行。你知道吗
解决方案是跟踪最后打印的行号,以便在当前匹配行之前打印足够的行。你知道吗
灵活的上下文参数
如果你还想前后打印3行而不是2行呢?然后你需要跟踪更多的线路。你知道吗
如果你只想要一个呢?你知道吗
然后,要打印的行数需要是一个参数,算法需要使用它。你知道吗
样本输入和输出
为了清晰起见,这里有一个文件示例,它包含单词MATCH而不是时间戳。其他行包含NOT+行号
== NOT 0 NOT 1 NOT 2 NOT 3 NOT 4 MATCH LINE 5 NOT 6 NOT 7 NOT 8 NOT 9 MATCH LINE 10 MATCH LINE 11 NOT 12 MATCH LINE 13 NOT 14 ==
输出应为:
== NOT 3 NOT 4 LINE 5 NOT 6 NOT 8 NOT 9 LINE 10 LINE 11 NOT 12 LINE 13 NOT 14 ==
解决方案
此解决方案迭代文件并跟踪:
下面是一个简化的英文算法:
不打印但返回数组
此解决方案不直接打印,而是返回一个包含所有要打印行的数组。那只是有点古典。你知道吗
我喜欢给我的“return”变量命名
result
,但那只是我自己。在整个算法中,结果变量是什么,这一点是显而易见的。你知道吗代码
您可以使用上面的输入尝试此代码,它将打印相同的输出。你知道吗
改进
getlines()
的使用效率很低:我们在开始之前读取整个文件。你知道吗只进行迭代会更有效,但是我们需要记住最后一行,以防需要打印它们。为此,我们将保留最后N行的列表,而不是更多。你知道吗
这是留给读者的练习:)
相关问题 更多 >
编程相关推荐