Python 3 按与特定模式匹配的名称过滤目录

Python 3 filtering directories by name that matches specific pattern

目前我正在开发将执行特定目录清理的脚本。

例如: 目录:/app/test/log 包含许多名称模式为 testYYYYMMDD 和 logYYYYMMDD

的子目录

我需要的是只过滤掉像 testYYYYMMDD 这样的目录

要获取给定目录中所有具有绝对路径的文件夹,我使用:

folders_in_given_folder = [name for name in os.listdir(Directory) if os.path.isdir(os.path.join(Directory, name))]
folder_list = []
for folder in folders_in_given_folder:
    folder_list.append([os.path.join(Directory, folder)])
print(folder_list)

给出输出:

[['/app/test/log/test20150615'], ['/app/test/log/test20150616'], ['/app/test/log/b'], ['/app/test/log/a'], ['/app/test/log/New folder'], ['/app/test/log/rem'], ['/app/test/log/test']]

所以现在我需要过滤掉符合模式的子目录, 模式可以是这样的:*test*, test*, test2015*

我试过使用 glob.glob(),但这似乎只适用于文件而不适用于目录。

有人可以这么客气并解释一下我如何才能达到预期的结果吗?

import os 
import re

result = []
reg_compile = re.compile("test\d{8}")
for dirpath, dirnames, filenames in os.walk(myrootdir):
    result = result + [dirname for dirname in dirnames if  reg_compile.match(dirname)]

按照建议我会解释(感谢 -1 顺便说一句 :D)

compile("test\d{8}) 将准备一个正则表达式,匹配任何名为 test 的文件夹,后跟一个 8 位数字格式的日期。

然后我利用 os.walk 方法在 folders 迭代器中正确地拥有每个文件夹(从而避免使用方法 is_dir

使用 [dirname for dirname in dirnames if reg_compile.match(dirname)] 行过滤名称与上述正则表达式匹配的文件夹。

对于第一个有效的答案(是的,这是第一个)(在我的计算机上针对 python2 和 python3 进行了测试),我发现被否决是很严厉的。接受的答案也包含我使用的同一种正则表达式。现在我也同意我应该早点解释。

能否请您删除该否决票?

您需要使用 re 模块。 re 模块是 regexp python 模块。 re.compile 创建重新对象,您可以使用 match 方法过滤列表。

    import re
    R = re.compile(pattern)
    filtered = [folder for folder in folder_list if R.match(folder)]

作为一种模式,您可以像这样使用 smth:

>>> R = re.compile(".*test.*")
>>>
>>> R.match("1test")
<_sre.SRE_Match object at 0x024ED800>
>>> R.match("1test")
<_sre.SRE_Match object at 0x024ED598>
>>> R.match("test2015")
<_sre.SRE_Match object at 0x024ED800>
>>> R.match("1test2")
<_sre.SRE_Match object at 0x024ED598>
Python 3.4.2 (default, Oct  8 2014, 13:08:17) 
>>> import re
>>> re.match(r'.*/[^/]*test[^/]*$', '/app/test/log/test20150616')
<_sre.SRE_Match object; span=(0, 26), match='/app/test/log/test20150616'>
>>> 

正则表达式 r'.*/[^/]*test[^/]*$' 表示匹配任何以 /*test* 结尾的路径,其中 * 为除 /.

之外的任何路径