2014-04-10 16 views
6

Ich habe Python 2.7 und ich versuche zu erteilen:Brace Expansion in Python glob

glob('{faint,bright*}/{science,calib}/chip?/') 

ich erhalten keine Treffer, aber von der Shell echo {faint,bright*}/{science,calib}/chip? gibt:

faint/science/chip1 faint/science/chip2 faint/calib/chip1 faint/calib/chip2 bright1/science/chip1 bright1/science/chip2 bright1w/science/chip1 bright1w/science/chip2 bright2/science/chip1 bright2/science/chip2 bright2w/science/chip1 bright2w/science/chip2 bright1/calib/chip1 bright1/calib/chip2 bright1w/calib/chip1 bright1w/calib/chip2 bright2/calib/chip1 bright2/calib/chip2 bright2w/calib/chip1 bright2w/calib/chip2 

Was mit meinem Ausdruck falsch ist ?

+0

I don‘ Ich denke, das Glob-Modul unterstützt geschweifte Klammern, siehe http://bugs.python.org/issue9584 –

+0

Das ['fnmatch'-Modul] (https://docs.python.org/2/library/fnmatch.html) (das von' glob' verwendet wird, um den passenden Dateinamen zu implementieren) ist nicht annähernd so ausgereift, um '{zu unterstützen. ..} 'Klammererweiterung Syntax. –

Antwort

3

Da {} sind nicht Teil glob() in Python, was Sie wahrscheinlich wollen, ist so etwas wie

import os 
import re 

... 

match_dir = re.compile('(faint|bright.*)/(science|calib)(/chip)?') 
for dirpath, dirnames, filenames = in os.walk("/your/top/dir") 
    if match_dir.search(dirpath): 
     do_whatever_with_files(dirpath, files) 
     # OR 
     do_whatever_with_subdirs(dirpath, dirnames) 
3

{..} wird als Klammerexpansion bezeichnet und ist ein separater Schritt, der angewendet wird, bevor das Globbing stattfindet.

Es ist nicht Teil von Globs und wird nicht von der Python-Glob-Funktion unterstützt.

2

Versuchen https://pypi.python.org/pypi/braceexpand

pip install braceexpand 

Demo:

>>> from braceexpand import braceexpand 

# Integer range 
>>> list(braceexpand('item{1..3}')) 
['item1', 'item2', 'item3'] 

# Nested patterns 
>>> list(braceexpand('python{2.{5..7},3.{2,3}}')) 
['python2.5', 'python2.6', 'python2.7', 'python3.2', 'python3.3']