我在 python 2.7.7 中使用 os.walk 搜索一个非常复杂的目录树,并希望通过对结果目录使用适当的修剪来限制搜索
import os,re
dirExclude = set(['amip4K','amip4xCO2','aqua4K','aqua4xCO2'])
for (path,dirs,files) in os.walk(inpath,topdown=True):
dirs[:] = [d for d in dirs if d not in dirExclude]
# Do something
我想附加到此 dirExclude 列表/设置与正则表达式 r'decadal[0-9]{4}' 匹配的任何内容,但是我很难确定如何最好地在我的列表中使用正则表达式/设置定义?
这里有什么建议吗?或者确实是使用 os.walk 函数的更有效方法?
经过一些建议,上述可以改进为:
import os,re
dirExclude = set(['amip4K','amip4xCO2','aqua4K','aqua4xCO2'])
decExclude = re.compile(r'decadal[0-9]{4}')
for (path,dirs,files) in os.walk(inpath,topdown=True):
dirs[:] = [d for d in dirs if d not in dirExclude and not re.search(decExclude,d)]
# Do something
在调查了 dir[:] = 与 dir = 分配之后,需要 [:] 来确保 os.walk 使用修剪后的目录列表,而不是完整的(预修剪的)目录列表
请您参考如下方法:
与其添加到 dirExclude,不如检查 dirname 中的 ?r'decadal[0-9]{4}' 是否匹配d
我在想这样的事情:
import re
dirExclude = set(['amip4K','amip4xCO2','aqua4K','aqua4xCO2'])
exre = re.compile(r'decadal[0-9]{4}')
for (path,dirs,files) in os.walk(inpath,topdown=True):
dirs = [d for d in dirs if d not in dirExclude and not exre.search(d)]
# Do something
解释:
exre.search(d) 将返回 None 如果在 d 中没有匹配您的正则表达式。 not None 将评估为 True。否则,exre.search(d) 将返回一个 MatchObject 而 not exre.search(d) 将计算为 False.
编译正则表达式是可选的。不编译,你会发出
exre = r'decadal[0-9]{4}'
和
dirs = [d for d in dirs if d not in dirExclude and not re.search(exre, d)]
当您需要多次应用正则表达式以便仅执行一次编译部分时,编译会很有用。但是,大多数时候您不会注意到差异,因为即使您不手动编译正则表达式,Python 也会缓存上次使用的正则表达式。准确地说,是最后 100 个正则表达式,尽管我为此获得的唯一引用是 Jan Goyvaerts 和 Steven Levithan 的 Regular Expression Cookbook。
