问题:
在大文件(纯文本)中,有一些“有趣”的行包含一些特定的单词。目的是提取包含这些单词的所有行。但是,在某些情况下,即使一行包含这样的单词,它也可能不是真正“有趣”,这取决于它的上下文(该行上方和下方的行的内容)。应排除这些界限。
我的算法:
我有一个正则表达式,每个有趣的单词,并在文件的每一行应用此正则表达式。如果找到匹配项,我会通过应用另一组正则表达式(可能跨越行)检查是否排除了该行(取决于其上下文)。如果再次找到匹配项,则该行不是有趣的行并继续前进到其余行。如果没有,我将此行注册为有趣的行,然后转到下一行。
为了检查是否排除了一行,我创建了一个新的字符串,如下所示:
N number of lines above current line\n The current line\n N number of lines below current line
这需要花费大量时间。
我的问题:有更好的方法吗?
感谢您的时间。
答案 0 :(得分:0)
正则表达式不一定快。那里有更快的字符串搜索算法。
如何采用更具启发性的方法。
从头到尾处理文件。将每行+偏移存储在查找结构中的感兴趣的单词行中。 填充查找结构后,开始使用以下算法处理它:
for elem in selected_word_items:
check line + index of related search items in structure.
if within_desired_range:
flag_for_further_processing()
这里的关键是你正在处理文件一次,然后使用元数据结构来进行实际的上下文检查。如果使用正确的数据结构,它应该会快得多。
答案 1 :(得分:0)
很大程度上取决于您的数据形式。
您的背景有多复杂?找回有趣的比赛你会回头吗?如果是这样尝试和 避免回溯。也许你可以先确定导致以下几行有趣匹配的背景。
另外,你需要Java吗?使用unix / linux cli工具,您可以对文本文件进行非常强大和快速的操作。
请发布您的算法以及您的数据。不需要真实数据只是真实的数据。
答案 2 :(得分:0)
在正则表达式中使用多行开关(?m)
,并在查询中包含前后行 - 这使得正则表达式可以在多行上运行(即行尾{{ 1}}只是另一个角色)。像这样:
$
并使用它将所有输入匹配为单个字符串。