Расширение брейков в глобусе python

У меня есть python 2.7 и пытаюсь выпустить:

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

Я не получаю совпадений, однако из оболочки echo {faint,bright*}/{science,calib}/chip? дает:

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

Что не так с моим выражением?

Ответ 1

Так как {} не являются частью glob() в Python, то, что вы, вероятно, хотите, это что-то вроде

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)

Ответ 2

{..} известен как расширение скобки и представляет собой отдельный шаг, применяемый до того, как происходит глобулизация.

Он не является частью глобусов и не поддерживается функцией glap python.

Ответ 3

Попробуйте https://pypi.python.org/pypi/braceexpand

pip install braceexpand

Демо:

>>> 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']

Ответ 4

Как отметил that other guy, Python не поддерживает непосредственное расширение скобок. Но так как расширение скобок выполняется до оценки подстановочных знаков, вы можете сделать это самостоятельно, например,

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

становится

result = [
    f 
    for b in ['faint', 'bright*'] 
    for s in ['science', 'calib'] 
    for f in glob('{b}/{s}/chip?/'.format(b=b, s=s))
]