python glob2 / formic样式递归通配符模式搜索列表

时间:2013-11-13 10:43:32

标签: python glob

我需要一个GLOB2FORMIC类似的解决方案来搜索文本文件中的大型目录列表(文件不在我的机器上,文件列表由外部进程生成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”

3 个答案:

答案 0 :(得分:2)

我建议使用正则表达式。最终,Formic和glob都使用OS调用来执行实际的glob匹配。所以,如果你想修改它们,你将不得不在任何情况下编写RE匹配器(或类似的)。因此,切断中间人并直接进入RE。 (我很难说,因为我是Formic的作者)。

基本计划是编写一个接受glob并返回正则表达式的函数。以下是一些提示:

  1. 在您的全局中转义并.-和其他RE保留字符。例如,.变为\.
  2. glob文件/目录中的?变为[^/](匹配不是/的单个字符)
  3. 作为正则表达式的glob文件/目录名中的*[^/]*
  4. 作为正则表达式的/*/ glob是:/[^/]+/
  5. 作为正则表达式的/**/ glob是:/([^/]+/)*
  6. 要匹配整行,请使用^启动RE,然后使用$结束。这会强制RE扩展整个字符串。
  7. 虽然我按照复杂性增加的顺序列出了替换,但按照以下顺序进行替换可能是个好主意:

    1. 非全球特殊RE字符(.-,'$'等)
    2. ?
    3. /**/
    4. /*/
    5. *
    6. 这样,在替换单个/**/时,您不会损坏*

      在您提出的问题中:/**/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]示例