Python pathlib 的 match 函数无法正常工作。

5

pathlib的match(pattern)被记录为将提供的glob样式模式与路径进行匹配,但实际上它并不起作用。

>>> Path("w/x/y/z").mkdir(parents=True)
>>> list(Path().glob("w/**/z"))
[PosixPath('w/x/y/z')]
>>> Path("w/x/y/z").match("w/**/z")
False

这个应该返回true吧?


1
我查看了pathlib.py(Python 3.7 - 查看lib),除了通过分隔符拆分模式外,它不会对**进行单独处理。 glob()通常用于搜索产生多个匹配项的目录路径,但是match()用于比较特定情况。 Path("w/x/y/z").match("w///z")有效吗? - Ben Y
@BenY 是的,那可以。rglob() 可以实现他想要的功能。 - myz540
简单地表达我的观点,因为似乎已经失去了,那就是match()glob()rglob()的工作方式不同。它没有实现将**视为多级目录的特殊匹配。答案是否定的,正如@myz540所说。 - Ben Y
1个回答

0

**的全局模式不会穿过路径分隔符。至少path.match()函数没有实现它。也许可以尝试使用递归全局匹配path.rglob()

尝试:

In [1]: from pathlib import Path

In [2]: p = Path("w/z/y/z")

In [3]: p.mkdir(parents=True)

In [5]: p.match("w/*/*/z")
Out[5]: True

我已经提到你可以使用rglob。不可接受的是什么?你的问题没有提出一个使用案例。你问是否应该返回True,给定glob样式模式,答案是否定的。 - myz540
2
Path.match 用于检查一个字符串是否符合某种模式。Path.rglob 用于在文件系统中查找与某种模式匹配的文件。这两者是完全不同的东西,使用 match 时甚至可能根本没有可用的文件系统,例如处理从 csv 文件或数据库中获取的路径。 - no step on snek
3
那么你为什么认为 Path("w/x/y/z").match("w/**/z") 不应该返回 True 呢?它匹配了 glob 模式,不是吗? - no step on snek
这也会返回true:Path("w/x/y/z").match("z"),因此我认为它与星号无关 - 但是,我期望它需要评估为true:Path("w/x/y/z").match("**/z") - Jeppe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接