微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将python路径与递归glob模式匹配

如何解决如何将python路径与递归glob模式匹配

我想使用可能包含 glob** 表达式过滤一个 linux 风格的相对路径列表。

例如:

+-- pattern.py
+-- dir_a
|   +-- pattern.py
|   +-- dir_b
|   |   +-- pattern.py

我在找什么:

glob_match('*.py','pattern.py')                         # -> True
glob_match('*.py','dir_a/pattern.py')                   # -> False
glob_match('dir_a/**/*.py','dir_a/pattern.py')          # -> True
glob_match('dir_a/*.py','dir_a/dir_b/pattern.py')       # -> False
glob_match('dir_a/**/*.py','dir_a/dir_b/pattern.py')    # -> True

如果我没记错的话,pathlib.Path.matchfnmatch.fnmatch不支持 **,而是将单个 * 解释为 任何字符,包括斜线,这使得上面的第二个和第四个例子给出 True

我想我可以看到如何实现这一点,但我会寻找一个我可以依赖的现有实现:)

谢谢!

编辑 澄清一下,我正在寻找的 glob_match 是执行匹配的 glob.glob(...,recursive=True) 位,没有执行文件系统扫描的位。换句话说,glob_match(pattern,rel_path) 的结果不应该依赖于 rel_path 指向实际文件,甚至不应该依赖于对文件系统的访问。

  • 暂时将 rel_path 写入文件系统只是为了运行 glob_match 将是一个解决方案,但我不想
  • 我想过挖掘 implementation in glob.glob 但由于它是作为迭代器编写的,似乎并不比从头开始编写新的 glob_match 容易...

解决方法

经过更多搜索,我发现 glob.globmatch 包中的 wcmatch 函数完全符合我的要求(与我的问题中的代码相比,参数相反:

print(glob.globmatch('pattern.py','*.py',flags=glob.GLOBSTAR))
print(glob.globmatch('dir_a/pattern.py','dir_a/**/*.py',flags=glob.GLOBSTAR))
print(glob.globmatch('dir_a/dir_b/pattern.py','dir_a/*.py',flags=glob.GLOBSTAR))

如果有人有基于 Python 标准库的解决方案,请让问题悬而未决。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。