我正在尝试提出一个 regex,以便在使用 os.walk 扫描根文件夹时仅过滤掉一种或多种特定类型(扩展名)的文件。我的文件夹结构(待搜索)如下所示。请注意没有扩展名的文件。
Directory: D:\Projects\5 Codes Cleaned\2012
SG
|---SG.zip
|---SOIL-Average.jpg
|---SWAT-Average.jpg
|---Test
1500_LT_Capped_2012
1500_LT_Capped_2012
1500_LT_Capped_2012
1500_LT_Capped_2012
1500_LT_Capped_2012
1500_LT_Capped_2012
1500_LT_Capped_2012
1500_LT_Capped_2012
PRESSURE-Average.png
SGAS-Average.png
SOIL-Average.png
SWAT-Average.png
或列表格式:
[u'D:\\Projects\\5 Codes Cleaned\\2012\\1500_LT_Capped_2012 -P',
u'D:\\Projects\\5 Codes Cleaned\\2012\\1500_LT_Capped_2012 -P.npy',
u'D:\\Projects\\5 Codes Cleaned\\2012\\1500_LT_Capped_2012 -Sg',
u'D:\\Projects\\5 Codes Cleaned\\2012\\1500_LT_Capped_2012 -Sg.npy',
u'D:\\Projects\\5 Codes Cleaned\\2012\\1500_LT_Capped_2012 -So',
u'D:\\Projects\\5 Codes Cleaned\\2012\\1500_LT_Capped_2012 -So.npy',
u'D:\\Projects\\5 Codes Cleaned\\2012\\1500_LT_Capped_2012 -Sw',
u'D:\\Projects\\5 Codes Cleaned\\2012\\1500_LT_Capped_2012 -Sw.npy',
u'D:\\Projects\\5 Codes Cleaned\\2012\\PRESSURE-Average.png',
u'D:\\Projects\\5 Codes Cleaned\\2012\\SGAS-Average.png',
u'D:\\Projects\\5 Codes Cleaned\\2012\\SOIL-Average.png',
u'D:\\Projects\\5 Codes Cleaned\\2012\\SWAT-Average.png',
u'D:\\Projects\\5 Codes Cleaned\\2012\\SG\\SG.zip',
u'D:\\Projects\\5 Codes Cleaned\\2012\\SG\\SOIL-Average.jpg',
u'D:\\Projects\\5 Codes Cleaned\\2012\\SG\\SWAT-Average.jpg',
u'D:\\Projects\\5 Codes Cleaned\\2012\\SG\\Test']
我查看了此处进行的一些线程以获取一些想法,但我想知道是否有更简单的方法来做到这一点。到目前为止,我已经尝试了以下模式来过滤掉 os.walk 结果:
regex = "^.*(?<!\.png)(?<!\.npy)$"
# The only working one but tends to get messy
# as more file types are to be excluded!
&
regex = "^(.+?)(?:\.(?:png|jpg))*$"
# Does not filter out jpg or png...list all files
&
regex = '^.*\.(?!jpg$|png$)[^.]+$'
# Filters out png & jpg but Does not include No-Extensions !
&
regex = '^.*\.*(?!.jpg$|.png$)'
# Does not filter out png & jpg file
请您参考如下方法:
为什么不直接使用 os.path.splitext 和列表理解?
disallowed_types = ['png', 'jpg']
allowed = [x for x in allfiles if os.path.splitext(x)[1] not in disallowed_types]
但如果你必须使用正则表达式,这似乎有效,但相反:
regex = '[^.]*?\.+(jpg$|png$)'
那么如果它匹配这个,它是一个 jpg 或 png 并且不应该被包含,否则它是安全的并且可以被包含在列表中。
