Skip to main content
 首页 » 编程设计

python之使用正则表达式输入创建列表

2024年10月25日33zhenyulu

我在 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。