.gitignore 样式 fnmatch()
Posted
技术标签:
【中文标题】.gitignore 样式 fnmatch()【英文标题】:.gitignore style fnmatch() 【发布时间】:2012-04-20 09:03:30 【问题描述】:在 Python 中使用 .gitignore 样式的 fnmatch() 最简单的方法是什么。看起来 stdlib 没有提供 match() 函数,该函数将路径规范与 UNIX 样式路径正则表达式匹配。
fnmatch() 只匹配纯文件名,不匹配路径http://docs.python.org/library/fnmatch.html?highlight=fnmatch#fnmatch
glob()会进行目录列表,不提供match()真假风格函数http://docs.python.org/py3k/library/glob.html?highlight=glob#glob.glob
.gitignore 的路径和带有通配符的文件都被列入(黑)名单
https://github.com/miohtama/Krusovice/blob/master/.gitignore
http://linux.die.net/man/5/gitignore
【问题讨论】:
为什么正则表达式对你不起作用? 我更愿意只接受有效的答案。 也许我问的问题太难了? :) 我猜你可以这样看,或者只是有不切实际的期望。你的一些问题得到了很好的活动,有些则没有。而且你也有一些被否决或关闭的;真是鱼龙混杂。当人们知道您是可以得到帮助的人时,它确实会激发人们在这个社区中与您的问题进行互动。如果没有什么能让你满意,那么尝试提供答案有什么意义? 我不是在寻找娱乐或因果报应,我在寻找答案。正确的答案将被接受,我希望人们在尝试之前就能做到这一点,这样我就不需要无耻地否决错误/不正确的答案。好的答案 = 好的业力 :) 【参考方案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.translate
与 re.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 作为解决方案。以上是关于.gitignore 样式 fnmatch()的主要内容,如果未能解决你的问题,请参考以下文章