我有一个包含多行的文件,其中可能会重复相邻行的块。
例如,在以下文件中,第1..8行与第9..17行相同:
ERROR2
ERROR3
ERROR4
CHANGE
RESET1
RESET2
RESET3
ERROR1
ERROR2
ERROR3
ERROR4
CHANGE
RESET1
RESET2
RESET3
ERROR1
SPAM
ERROR2
ERROR3
ERROR4
CHANGE
RESET1
RESET2
RESET3
ERROR1
ERROR2
ERROR3
我希望该工具能够找到相邻重复行的区域并给出一些重复指示以及重复次数的指示,例如,如果下面输出的第一列是重复计数并且重复的行是向上的到下一个重复计数,那么答案可能是:
2 ERROR2
ERROR3
ERROR4
CHANGE
RESET1
RESET2
RESET3
ERROR1
1 SPAM
ERROR2
ERROR3
ERROR4
CHANGE
RESET1
RESET2
RESET3
ERROR1
ERROR2
ERROR3
我该怎么办?有没有预先写好的实用程序?没错,一个程序或算法?
感谢。
答案 0 :(得分:1)
你可以这样做的一种方法是浏览文件并构建一个" biwords"的字典。也就是说,ERROR2-ERROR3
是双字,ERROR3-ERROR4
也是。对于字典中的每个条目,存储它们存在的位置。
构建该词典后,请浏览并丢弃在文件中只出现一次的每个双字。根据定义,它不能重复。
从剩下的字典中,您可以对条目进行排序并创建一个"三字组"字典使用一个非常相似的过程。你可以重复一个n字词,直到不再有那个长度的重复序列。
显然,每次通过列表,您都要检查不成为(n + 1)个字的n字。因此,当您发现四个单词的重复序列不是5个单词序列的一部分时,您将要检查它们。
这不是一种非常有效的算法,但它具有简单的优点。虽然它在理论上有可怕的最坏情况行为,但它可以在你的情况下很好地工作。现实世界的运行时间取决于文件的大小,重复序列的数量以及文件的长度。很有可能在第一次传递(biwords)之后,你的数据大小会缩小,以至于效率低下的算法运行得很好。
答案 1 :(得分:0)
我根据上述评论的多行捕获正则表达式写了一些东西:
r"""(?ms)(?P<repeat>(?P<lines>^.*?$)(?:\n(?P=lines))+)"""
修改强>
我最后写了关于我的解决方案here的博文。