【问题标题】:.gitignore style fnmatch().gitignore 样式 fnmatch()
【发布时间】:2012-04-20 09:03:30
【问题描述】:

在 Python 中使用 .gitignore 样式的 fnmatch() 最简单的方法是什么。看起来 stdlib 没有提供 match() 函数,该函数将路径规范与 UNIX 样式路径正则表达式匹配。

.gitignore 的路径和带有通配符的文件都被列入(黑)名单

【问题讨论】:

  • 为什么正则表达式对你不起作用?
  • 我更愿意只接受有效的答案。
  • 也许我问的问题太难了? :)
  • 我猜你可以这样看,或者只是有不切实际的期望。你的一些问题得到了很好的活动,有些则没有。而且你也有一些被否决或关闭的;真是鱼龙混杂。当人们知道您是可以得到帮助的人时,它确实会激发人们在这个社区中与您的问题进行互动。如果没有什么能让你满意,那么尝试提供答案有什么意义?
  • 我不是在寻找娱乐或因果报应,我在寻找答案。正确的答案将被接受,我希望人们在尝试之前就能做到这一点,这样我就不需要无耻地否决错误/不正确的答案。好的答案 = 好的业力 :)

标签: python regex filenames gitignore fnmatch


【解决方案1】:

有一个名为pathspec 的库,它实现了完整的.gitignore 规范,包括**/*.py 之类的东西; documentation 描述了如何处理 Git 模式匹配(您也可以查看 code)。

>>> import pathspec
>>> spec_src = '**/*.pyc'
>>> spec = pathspec.PathSpec.from_lines(pathspec.patterns.GitWildMatchPattern, spec_src.splitlines())
>>> set(spec.match_files({"test.py", "test.pyc", "deeper/file.pyc", "even/deeper/file.pyc"}))
set(['test.pyc', 'even/deeper/file.pyc', 'deeper/file.pyc'])
>>> set(spec.match_tree("pathspec/"))
set(['__init__.pyc', 'gitignore.pyc', 'util.pyc', 'pattern.pyc', 'tests/__init__.pyc', 'tests/test_gitignore.pyc', 'compat.pyc', 'pathspec.pyc'])

【讨论】:

    【解决方案2】:

    如果您想使用 .gitignore 示例中列出的混合 UNIX 通配符模式,为什么不采用每个模式并将 fnmatch.translatere.search 一起使用?

    import fnmatch
    import re
    
    s = '/path/eggs/foo/bar'
    pattern = "eggs/*"
    
    re.search(fnmatch.translate(pattern), s)
    # <_sre.SRE_Match object at 0x10049e988>
    

    translate 将通配符模式转换为 re 模式

    隐藏的 UNIX 文件:

    s = '/path/to/hidden/.file'
    isHiddenFile = re.search(fnmatch.translate('.*'), s)
    if not isHiddenFile:
        # do something with it
    

    【讨论】:

    • 不幸的是,这种简单的 fnmatch 模式失败了,比如 .*(忽略所有 UNIX 隐藏文件)。
    • @MikkoOhtamaa:我不确定我是否跟随。我的更新显示它正确匹配隐藏的 unix 文件的路径。
    • @MikkoOhtamaa:是的,我放弃了。我不明白相关性。祝你好运!
    • 但是你走在了非常正确的轨道上 - 错误更像是 Python fnmatch() 本身的更深层次的问题。我会将其标记为已关闭,并将此链接留给后代github.com/miohtama/vvv/tree/master/vvv/bzrlib 作为解决方案。
    猜你喜欢
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2020-10-27
    • 2011-02-11
    • 2019-07-17
    • 2016-04-26
    • 2018-08-15
    相关资源
    最近更新 更多