pythonglob2/formic风格递归通配符模式搜索列表

2024-06-16 13:45:30 发布

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

我需要一个类似于GLOB2FORMIC的解决方案来搜索文本文件中的大目录列表(文件不在我的机器上,文件列表是由一个无法直接访问或查询的外部进程生成的)

伪示例:

# 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.步行““


Tags: 文件目录机器log示例列表readdata
3条回答

最后我使用了glob2的一个函数,比如:

import glob2

def listglob(data,pattern):
    return [x for x in items if glob2.fnmatch.fnmatch(x,pattern)]

我不认为glob2.fnmatch.fnmatch等同于glob2 **语法。在

从阅读源代码中可以看出,它相当于fnmatch语法。在

安德鲁的回答也没有涵盖方括号。还有[!abc]的例子

我建议使用正则表达式。最终,Formic和glob都使用OS调用来执行实际的glob匹配。所以,如果你想修改其中一个,你就必须在任何情况下编写一个重新匹配器(或类似的)。所以,删掉中间人,直接去REs(我很难说,因为我是Formic的作者)。在

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

  1. 转义符和.-以及全局中其他重新保留的字符。例如.变成{}
  2. glob文件/目录中的?变成{}(匹配一个不是/的单个字符)
  3. 在glob文件/目录名中作为正则表达式的*[^/]*
  4. 作为正则表达式的/*/glob是:/[^/]+/
  5. 作为正则表达式的/**/glob是:/([^/]+/)*
  6. 要匹配整行,请以^开始RE,并以$结束。这就迫使RE在整个弦上展开。在

虽然我按复杂性增加的顺序列出了替换,但最好按以下顺序进行替换:

  1. 不是globs的特殊RE字符(.-,“$”等)
  2. ?
  3. /**/
  4. /*/
  5. *

这样您就不会在替换单个*时损坏/**/。在

你的问题是:/**/fnord/*/log.*。这将映射到:

^/([^/]+/)*fnord/[^/]+/log\.[^/]*

一旦你建立了你的RE,那么寻找匹配是一个简单的练习。在

相关问题 更多 >