使用fnmatch.fnmatch(path,“*”) - 它是否匹配所有内容?

时间:2014-01-27 11:28:06

标签: python python-2.7 glob

我继承了一些使用os.walk来遍历文件系统部分的代码。

for (dirpath, _, filenames) in os.walk(blahblah):
    reldir = dirpath[len(base)+1:]
    if fnmatch(reldir, './lost+found'):
        continue

    for path in filenames:
        if fnmatch.fnmatch(path, "*"):
            ...

我无法理解使用fnmatch来匹配" *",是否存在不匹配的内容?

我使用".", "..", ".hidden", "normal.name", "normal"进行了一些类似的测试,但似乎没有任何过滤掉。

我在文档中看不到任何内容,我猜这条线是有原因的,有人可以启发我吗?

1 个答案:

答案 0 :(得分:2)

是的,它匹配一切。如果您追踪fnmatch.fnmatch的源代码,可以归结为模式上的正则表达式匹配

In [4]: fnmatch.translate('*')
Out[4]: '.*\\Z(?ms)'

匹配0或更多字符,后跟字符串结尾(\Z),并打开MULTILINE和DOTALL标志。这将匹配任何字符串。


也许在某些时候该行

if fnmatch.fnmatch(path, "*"):

使用了更复杂的模式,但后来更改为"*"而不是省略检查。但那只是猜测。

在任何情况下,都可以删除if-condition,因为它始终为True。