【发布时间】:2011-01-09 13:53:16
【问题描述】:
我想获取适用于我拥有的正则表达式的文件列表。我想我应该使用 os.walk,但是如何将它与正则表达式一起使用?
谢谢。
【问题讨论】:
-
请发布一些您尝试使用的代码。请发布您提出的解决方案,包括您收到的任何错误消息。这不是
www.do-my-job-for-me.com
我想获取适用于我拥有的正则表达式的文件列表。我想我应该使用 os.walk,但是如何将它与正则表达式一起使用?
谢谢。
【问题讨论】:
www.do-my-job-for-me.com
我不知道 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
【讨论】:
如果您的正则表达式可以翻译成诸如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']
【讨论】: