python glob2/formic 风格的递归通配符模式搜索列表

标签 python glob

我需要一个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.walked”根文件夹

最佳答案

我建议使用正则表达式。最终,Formic 和 glob 都使用操作系统调用来执行实际的 glob 匹配。因此,如果您想修改其中任何一个,则无论如何您都必须编写 RE 匹配器(或类似的)。因此,省掉中间人,直接进入 RE。 (这么说让我很痛苦,因为我是 Formic 的作者)。

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

  1. Escape 和 .- 以及 glob 中的其他 RE 保留字符。例如 . 变为 \.
  2. glob 文件/目录中的 ? 变为 [^/](匹配非 / 的单个字符)
  3. glob 文件/目录名称中的 * 作为正则表达式是 [^/]*
  4. /*/ glob 作为正则表达式是:/[^/]+/
  5. 作为正则表达式的 /**/ glob 为:/([^/]+/)*
  6. 要匹配整行,请以 ^ 开始 RE,并以 $ 结束。这会强制 RE 扩展到整个字符串。

虽然我按照复杂性增加的顺序列出了替换,但按以下顺序进行替换可能是个好主意:

  1. 非通配符的特殊 RE 字符(.-、'$' 等)
  2. /**/
  3. /*/
  4. *

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

在您的问题中,您有:/**/fnord/*/log.*。这将映射到:

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

构建 RE 后,查找匹配项就是一个简单的练习。

关于python glob2/formic 风格的递归通配符模式搜索列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19951611/

相关文章:

python - 用填充的 0 来通配一个范围 - python

python - pandas数据框浮点问题

python - 如何按字符串字段中的数字字符对行进行分组?

python - model.fit() Keras 分类多输入-单输出给出错误 : AttributeError: 'NoneType' object has no attribute 'fit'

Python:用于创建基于 PID 的锁定文件的模块?

python - 将 pandas 数据框转换为具有新键名的字典

c++ - 面向对象的替代 glob/globfree

angular - 使用具有多个通配符的 Globbing 模式在 TypeScript 中进行模块解析

php - 可以使 PHP 的 glob() 以不区分大小写的方式查找文件吗?

PHP - Glob 多个文件扩展名仅显示列出的第一个扩展名