gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:23:04 32 4
gpt4 key购买 nike

我需要一个 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 匹配器(或类似的)。所以,去掉中间人,直接去找 REs。 (这么说让我很痛苦,因为我是 Formic 的作者)。

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

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

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

  1. 不是 glob 的特殊 RE 字符(.-、'$' 等)
  2. ?
  3. /**/
  4. /*/
  5. *

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

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

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

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

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

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com