2011-01-09 3 views
2

나는 정규식에 적용되는 파일 목록을 얻고 싶습니다. os.walk를 사용해야한다고 생각하지만, 정규 표현식으로 어떻게 사용할 수 있습니까?os.walk with regex

감사합니다.

+5

몇 가지 코드를 게시하시기 바랍니다 당신이 사용하려고 시도한 것입니다. 오류 메시지를 포함하여 제안 된 솔루션을 게시하십시오. 이것은 'www.do-my-job-for-me.com'이 아닙니다. –

답변

5

정규 표현식을 foo/*.txt과 같은 쉘 표현식으로 변환 할 수 있다면 glob을 사용할 수 있습니다.

>>> import glob 
>>> glob.glob('./[0-9].*') 
['./1.gif', './2.txt'] 
>>> glob.glob('*.gif') 
['1.gif', 'card.gif'] 
>>> glob.glob('?.gif') 
['1.gif'] 
6

나는이를 구현하는 다음 stdlib에서 아무것도 잘 모르는 것 같아요,하지만 코드에 하드되지 않습니다 :

import os, os.path 

def iter_matching(dirpath, regexp): 
    """Generator yielding all files under `dirpath` whose absolute path 
     matches the regular expression `regexp`. 
     Usage: 

      >>> for filename in iter_matching('/', r'/home.*\.bak'): 
      .... # do something 
    """ 
    for dir_, dirnames, filenames in os.walk(dirpath): 
     for filename in filenames: 
      abspath = os.path.join(dir_, filename) 
      if regexp.match(abspath): 
       yield abspath 

또는 더 일반적인 :

import os, os.path 

def filter_filenames(dirpath, predicate): 
    """Usage: 

      >>> for filename in filter_filenames('/', re.compile(r'/home.*\.bak').match): 
      .... # do something 
    """ 
    for dir_, dirnames, filenames in os.walk(dirpath): 
     for filename in filenames: 
      abspath = os.path.join(dir_, filename) 
      if predicate(abspath): 
       yield abspath