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*
结尾的路径,其中 *
为除 /
.
之外的任何路径
目前我正在开发将执行特定目录清理的脚本。
例如: 目录:/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*
结尾的路径,其中 *
为除 /
.