【问题标题】:Negating a fnmatch pattern否定 fnmatch 模式
【发布时间】:2014-10-09 00:00:40
【问题描述】:

考虑这种模式:*.py。它匹配所有以py 扩展名结尾的路径。现在,是否有可能找到与其他所有内容相匹配的模式?

我认为这样做可以:*[!.][!p][!y],但显然fnmatch.fnmatch 总是返回False

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

【问题讨论】:

  • 仅供参考,fnmatch 确实 总是为您建议的模式返回 Falsefnmatch.fnmatch("blah","*[!.][!p][!y]") 返回 True。您可能观察到的行为是,只要倒数第三个字符是 .*[!.][!p][!y] 就必须返回 False

标签: python glob fnmatch


【解决方案1】:

我个人更喜欢正则表达式,但如果你更喜欢 fnmatch,你可以这样做:

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

【讨论】:

  • 是的,我知道我可以做这样的事情。但我实际上是在寻找一个 pattern 因为我必须在使用 fnmatch 的程序的 --exclude 选项中使用它。
  • @rubik 我不明白使用这种方法有什么困难?你能再解释一下吗?
  • @JonClements:这种方法本身并不难,只是不适合我的用例。我正在使用一个分析一些文件的程序。我可以使用采用 fnmatch 模式的 --exclude 选项排除文件。没有--include 选项。由于我想排除所有不是 Python 文件的内容,所以我很好奇是否存在这样的模式。
  • @JonClements:不是。模式是指fnmatch.fnmatch 的第二个参数。我正在寻找的模式与 Python 文件不匹配,但与其他所有文件匹配。想想这种情况,好像我只能更改fnmatch 的第二个参数,但我无法触及其他任何东西。
  • *[!p][!y] 匹配任何p作为倒数第二个字符并且没有y作为它的最后一个字符。例如,带有.pl 扩展名的 Perl 脚本将被排除在外。
【解决方案2】:

我相信唯一绝对正确的答案是生成不需要的文件列表,然后找到该列表与完整(未过滤的)文件列表之间的差异。 (这个技术可以看这里,使用set:https://stackoverflow.com/a/8645326/1858225

fnmatch 模块中似乎没有任何用于否定搜索模式的内置选项。

有关为什么按字符取反不起作用的示例,请参阅我对 user590028 答案的评论。

【讨论】:

  • 有趣的方法,这似乎也是最正确的一种。谢谢!
猜你喜欢
  • 2012-04-20
  • 2019-07-17
  • 2021-09-17
  • 2021-01-31
  • 1970-01-01
  • 2020-01-23
  • 2014-04-06
  • 2016-01-05
  • 2014-11-16
相关资源
最近更新 更多