2013-08-20 54 views
3

是否有任何内置或直接的方式递归地用双星号来匹配路径,例如:像zsh呢?fnmatch和递归路径与`**`匹配

例如,

path = 'foo/bar/ham/spam/eggs.py' 

我可以使用fnmatch

fnmatch(path, 'foo/bar/ham/*/*.py' 

来测试它。虽然,我希望能够做到:

fnmatch(path, 'foo/**/*.py') 

我知道那fnmatch maps its pattern to regex,所以在词的情况下,我可以推出我自己的fnmatch额外的**格局,但也许还有一个更简单的方法

+0

东西像' glob.glob'? –

+0

这是一个允许fnmatch *和** https://pypi.python.org/pypi/pywildcard的分支 –

回答

2

如果你考虑的fnmatch源代码紧密结合,它映射*.*,因此不关心目录分隔符/任何东西 - 不像UNIX外壳:

while i < n: 
    c = pat[i] 
    i = i+1 
    if c == '*': 
     res = res + '.*' 
    elif c == '?': 
     res = res + '.' 
    elif c == '[': 
     ... 

因此

>>> fnmatch.fnmatch('a/b/d/c', 'a/*/c') 
True 
>>> fnmatch.fnmatch('a/b/d/c', 'a/*************c') 
True 
3

如果你能活着,而无需使用os.walk循环,尝试:

glob2

formic

我个人使用glob2:

import glob2 
files = glob2.glob(r'C:\Users\**\iTunes\**\*.mp4') 

附录:

对于Python 3.5的,天然glob模块支持递归模式匹配:

import glob 
files = glob.iglob(r'C:\Users\**\iTunes\**\*.mp4', recursive=True)