【问题标题】:os.walk with regexos.walk 与正则表达式
【发布时间】:2011-01-09 13:53:16
【问题描述】:

我想获取适用于我拥有的正则表达式的文件列表。我想我应该使用 os.walk,但是如何将它与正则表达式一起使用?

谢谢。

【问题讨论】:

  • 请发布一些您尝试使用的代码。请发布您提出的解决方案,包括您收到的任何错误消息。这不是www.do-my-job-for-me.com

标签: python regex os.walk


【解决方案1】:

我不知道 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

【讨论】:

    【解决方案2】:

    如果您的正则表达式可以翻译成诸如foo/*.txt 这样的shell 表达式,那么您可以使用glob

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-12
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 2017-12-18
      相关资源
      最近更新 更多