我需要一个类似于GLOB2或FORMIC的解决方案来搜索文本文件中的大目录列表(文件不在我的机器上,文件列表是由一个无法直接访问或查询的外部进程生成的)
伪示例:
# 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.步行““
最后我使用了glob2的一个函数,比如:
我不认为
glob2.fnmatch.fnmatch
等同于glob2 **
语法。在从阅读源代码中可以看出,它相当于
fnmatch
语法。在安德鲁的回答也没有涵盖方括号。还有
[!abc]
的例子我建议使用正则表达式。最终,Formic和
glob
都使用OS调用来执行实际的glob匹配。所以,如果你想修改其中一个,你就必须在任何情况下编写一个重新匹配器(或类似的)。所以,删掉中间人,直接去REs(我很难说,因为我是Formic的作者)。在基本计划是编写一个接受glob并返回正则表达式的函数。以下是一些提示:
.
、-
以及全局中其他重新保留的字符。例如.
变成{?
变成{/
的单个字符)*
是[^/]*
/*/
glob是:/[^/]+/
/**/
glob是:/([^/]+/)*
^
开始RE,并以$
结束。这就迫使RE在整个弦上展开。在虽然我按复杂性增加的顺序列出了替换,但最好按以下顺序进行替换:
.
,-
,“$”等)?
/**/
/*/
*
这样您就不会在替换单个
*
时损坏/**/
。在你的问题是:
/**/fnord/*/log.*
。这将映射到:一旦你建立了你的RE,那么寻找匹配是一个简单的练习。在
相关问题 更多 >
编程相关推荐