2013-08-20 84 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)