否定fnmatch模式

5 投票
3 回答
7521 浏览
提问于 2025-04-18 17:23

考虑这个模式:*.py。它会匹配所有以py结尾的路径。现在,是否有可能找到一个匹配其他所有内容的模式呢?

我想这个可以做到:*[!.][!p][!y],但显然,fnmatch.fnmatch在这种情况下总是返回False

我想避免使用正则表达式。我知道我可以用它们,但在这种情况下不太合适。

3 个回答

0

如果files是一个文件列表,那么这段代码会用fnmatch.filter来排除所有符合*.py这个模式的文件。这样做应该是正确的。

exclude = '*.py'
for f in fnmatch.filter(files, exclude):
    files.remove(f)
3

我认为唯一绝对正确的做法是先生成一个不想要文件的列表,然后找出这个列表和完整(没有过滤的)文件列表之间的差异。这个方法可以参考这里,使用了sethttps://stackoverflow.com/a/8645326/1858225

fnmatch模块中,似乎没有内置的选项可以用来否定搜索模式。

关于为什么逐个字符否定的方法行不通,可以看看我对用户590028回答的评论。

5

我个人比较喜欢用正则表达式,不过如果你更喜欢用fnmatch的话,你可以这样做:

if fnmatch.fnmatch(file, '*[!p][!y]'):
        print(file)

撰写回答