2015-06-17 80 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*結尾的任何路徑,其中*,除了/任何東西。