我需要一个GLOB2或FORMIC类似的解决方案来搜索文本文件中的大型目录列表(文件不在我的机器上,文件列表由外部进程生成i无法直接访问或查询)
伪示例:
# read the large directory list in memory
data = []
with open('C:\\log_file.txt','r') as log:
data = log.readlines()
# query away!
query1 = listglob(data,'/**/fnord/*/log.*')
query2 = listglob(data,'/usr/*/model_*/fnord/**')
除非有人有建议,否则我的下一步是打开glob2和formic,看看是否可以将其中一个更改为接受列表而不是根文件夹为“os.walked”
答案 0 :(得分:2)
我建议使用正则表达式。最终,Formic和glob
都使用OS调用来执行实际的glob匹配。所以,如果你想修改它们,你将不得不在任何情况下编写RE匹配器(或类似的)。因此,切断中间人并直接进入RE。 (我很难说,因为我是Formic的作者)。
基本计划是编写一个接受glob并返回正则表达式的函数。以下是一些提示:
.
,-
和其他RE保留字符。例如,.
变为\.
?
变为[^/]
(匹配不是/
的单个字符)*
为[^/]*
/*/
glob是:/[^/]+/
/**/
glob是:/([^/]+/)*
^
启动RE,然后使用$
结束。这会强制RE扩展整个字符串。虽然我按照复杂性增加的顺序列出了替换,但按照以下顺序进行替换可能是个好主意:
.
,-
,'$'等)?
/**/
/*/
*
这样,在替换单个/**/
时,您不会损坏*
。
在您提出的问题中:/**/fnord/*/log.*
。这将映射到:
^/([^/]+/)*fnord/[^/]+/log\.[^/]*
一旦你建立了你的RE,那么找到匹配就是一个简单的练习。
答案 1 :(得分:1)
最后我使用了glob2的一个函数,如下所示:
import glob2
def listglob(data,pattern):
return [x for x in items if glob2.fnmatch.fnmatch(x,pattern)]
答案 2 :(得分:0)
我不认为glob2.fnmatch.fnmatch
等同于glob2 **
语法。
它等同于我从阅读源代码时可以看出的fnmatch
语法。
安德鲁的答案也没有涵盖方括号。和[!abc]
示例