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

2024-10-01 13:32:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如: 目录:/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)

输出:

^{pr2}$

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

我试过用环球网(),但这似乎只适用于文件而不是目录。在

请你解释一下我怎样才能得到想要的结果?在


Tags: pathnameintest目录foros模式
3条回答
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 btw: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模块是regexp python模块。 re.compile创建re对象,您可以使用match方法筛选列表。在

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

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

^{pr2}$
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*结尾的任何路径*匹配为/之外的任何路径。在

相关问题 更多 >