否定fnmatch模式
考虑这个模式:*.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
我认为唯一绝对正确的做法是先生成一个不想要文件的列表,然后找出这个列表和完整(没有过滤的)文件列表之间的差异。这个方法可以参考这里,使用了set
:https://stackoverflow.com/a/8645326/1858225
在fnmatch
模块中,似乎没有内置的选项可以用来否定搜索模式。
关于为什么逐个字符否定的方法行不通,可以看看我对用户590028回答的评论。
5
我个人比较喜欢用正则表达式,不过如果你更喜欢用fnmatch的话,你可以这样做:
if fnmatch.fnmatch(file, '*[!p][!y]'):
print(file)