2014-04-10 13 views
6

Tôi có python 2.7 và đang cố gắng để phát hành:mở rộng Brace trong python glob

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

tôi có được không các trận đấu, tuy nhiên từ vỏ echo {faint,bright*}/{science,calib}/chip? cho:

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 

Điều gì là sai với biểu hiện của tôi ?

+0

I don' t nghĩ rằng mô-đun glob hỗ trợ dấu ngoặc nhọn, xem http://bugs.python.org/issue9584 –

+0

Mô-đun ['fnmatch'] (https://docs.python.org/2/library/fnmatch.html) (được sử dụng bởi' glob' để thực hiện khớp tên tệp) không gần như tinh vi như để hỗ trợ '{. ..} Cú pháp mở rộng cú đúp. –

Trả lời

3

Kể từ {} không nằm glob() trong Python, những gì bạn có thể muốn là một cái gì đó giống như

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

{..} được gọi là mở rộng cú đúp, và là một bước riêng biệt được áp dụng trước khi quá trình hình cầu diễn ra.

Nó không phải là một phần của bóng đèn, và không được hỗ trợ bởi hàm glob python.

2

Hãy thử 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'] 
Các vấn đề liên quan