2015-06-17 47 views
2

目前我正在开发将执行特定目录的清理的脚本。Python 3按名称匹配特定模式的目录

例如: 目录:/应用/测试/登录 包含许多子目录与名称模式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']] 

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

我使用glob.glob()试图test2015 *但这似乎只适用于文件而不是目录。

难道有人请这么善良,并解释我如何能达到预期的结果?

回答

4
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迭代

随着线[dirname for dirname in dirnames if reg_compile.match(dirname)]我筛选其名称匹配正则表达式上面所解释的文件夹(因此使用该方法is_dir避免)。

对于第一个答案(是的,它是第一个)的作品(在我的电脑上测试python2和python3),我觉得它是苛刻的downvoted。接受的答案也包含我使用的同类正则表达式。现在我也同意我应该早些时候解释过。

你会友善地删除downvote吗?

+0

请尝试解释你做了什么,而不是只是粘贴代码片段作为答案 - 这样,OP(和其他任何人)将能够得到更好的理解。 – dhh

+0

答复已更新。请检阅谢谢 – Azurtree

+0

太好了,谢谢! – dhh

1

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

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

如可以使用不便这样的图案:

>>> 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> 
0
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*结尾的任何路径,其中*,除了/任何东西。