我需要一个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.walked”根文件夹
最佳答案
我建议使用正则表达式。最终,Formic 和 glob 都使用操作系统调用来执行实际的 glob 匹配。因此,如果您想修改其中任何一个,则无论如何您都必须编写 RE 匹配器(或类似的)。因此,省掉中间人,直接进入 RE。 (这么说让我很痛苦,因为我是 Formic 的作者)。
基本计划是编写一个接受 glob 并返回正则表达式的函数。以下是一些提示:
- Escape 和
.
、-
以及 glob 中的其他 RE 保留字符。例如.
变为\.
- glob 文件/目录中的
?
变为[^/]
(匹配非/
的单个字符) - glob 文件/目录名称中的
*
作为正则表达式是[^/]*
/*/
glob 作为正则表达式是:/[^/]+/
- 作为正则表达式的
/**/
glob 为:/([^/]+/)*
- 要匹配整行,请以
^
开始 RE,并以$
结束。这会强制 RE 扩展到整个字符串。
虽然我按照复杂性增加的顺序列出了替换,但按以下顺序进行替换可能是个好主意:
- 非通配符的特殊 RE 字符(
.
、-
、'$' 等) ?
/**/
/*/
*
这样,在替换单个 *
时就不会损坏 /**/
。
在您的问题中,您有:/**/fnord/*/log.*
。这将映射到:
^/([^/]+/)*fnord/[^/]+/log\.[^/]*
构建 RE 后,查找匹配项就是一个简单的练习。
关于python glob2/formic 风格的递归通配符模式搜索列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19951611/