如何利用Python加快在長篇文件中進行搜索?

2024-09-29 17:18:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否可以使用Python在Vim中进行搜索,以加速长文档中的搜索。你知道吗

我有一个140.000行的文本文档。
我有一个包含115种不同搜索模式的列表(mysearch)。
我想把所有匹配的行放在一个列表中(点击)

我现在就是这么做的:

 for i in range(0,len(mysearches)-1)

   for line in range(1, line("$"))
     let idx = match(getline(line), mysearches[i])
     if idx >= 0
       call add(hits, line)
     endif
   endfor
 endfor

“删除双行号:

 let unduplist=filter(copy(hits), 'index(hits, v:val, v:key+1)==-1')

问题是此搜索需要5分钟以上。
如何使上述搜索适应python搜索?你知道吗


Tags: in文档列表forline模式range文本文档
2条回答

这个怎么样:

let pattern=join(mysearches, '\|')
let mylist = systemlist('grep -n "'.pattern.'" '. shellescape(fnamemodify(@%, ':p')). ' | cut -d: -f1')

这是通过\|(例如,剥离所有不同的模式)、剥离并使用grep来处理模式来实现的。Grep应该非常快,比vim快得多,而且可能比python甚至perl都快(当然这取决于模式)。 返回值是一个包含所有匹配行的列表。因为我们使用grep的-n开关,所以我们收到了匹配的行号,这些行号又被cut切掉了。你知道吗

systemlist()然后包含在\n处的输出分割。因此mylist应该包含与您的模式匹配的所有行。这当然取决于您的模式,但是如果您使用标准的BRE或ERE(-E)甚至perl-RE(-P开关),您应该可以。根据所需的味道,需要调整连接部分。你知道吗

请注意,这基本上是未经测试的,对于一个真正健壮的解决方案,可能会添加更多的错误处理(可能是模式的预处理),并将整个部分拆分一点,以便更易于阅读。你知道吗

确实是个问题。你知道吗

您可以这样使用:vimgrep命令:

execute "vim /\\(" . join(mysearches, "\\|") . "\\)/ %"
cwindow

我刚刚测试了我正在处理的4017行长的.less文件的内容,将34次内容粘贴到一个新的136579行长的文件和一个只有13次搜索的列表中:

:let foo = ["margin", "padding", "width", "height", "bleu", "gris", "none", "auto", "background", "color", "line", "border", "overflow"]

花了3秒钟找到47634条匹配行,这些匹配行现在方便地列在quickfix窗口中。你知道吗

当然是YMMV,因为当你向mysearches添加项目并使其复杂化时,搜索会花费更多的时间,但我相当肯定你能够轻松地击败当前的时机。你知道吗

您也可以使用:grep

execute "grep -snH " . shellescape(join(foo, '\\|')) . " %"

相关问题 更多 >

    热门问题