如何解决如何将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.match
和 fnmatch.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 举报,一经查实,本站将立刻删除。