【发布时间】:2018-08-03 02:34:43
【问题描述】:
我对 python 很陌生,但学得很快。我正在尝试将正则表达式与 os.walk 一起使用来忽略我不想处理的目录。我了解您必须就地修改目录而不是创建新列表。我已经尝试过两种方式。我没有收到任何错误,但它仍然遍历所有目录。排除完整的目录名称可以正常工作。我正在尝试删除名称中带有“EXP”或“-”或“3.2”的所有目录。这是我想忽略的示例 3.2.2.150-20150424.195805_EXP_manuMain_outOfMemFix
这就是我所拥有的:
def runtest(filepath_udu: object) -> object:
k = 1
for root, dirs, files in os.walk(filepath_udu, topdown=True):
dirs[:] = [item for item in dirs
if item not in ('1node','local','remote')]
dirs[:] = [dir for dir in dirs
if re.search(r'\bEXP\b', dir) not in dirs \
or re.search(r'\b3.2\b', dir) not in dirs \
or re.search(r'\w+(?:- \w+)+', dir) not in dirs]
for file in files:
do something...
我的第二个目录 [:] 被忽略了,我做错了什么?谢谢
【问题讨论】:
-
if re.search(r'\bEXP\b', dir) not in dirs检查单词“EXP”是否不在dirs的列表中。大多数时候,事实并非如此。你想要的是if not re.search(r'\bEXP\b', dir)(原文如此)。与其他两个条件相同,将'or'改为'and'。 -
附带说明,在括号、方括号或大括号内的表达式中不需要反斜杠继续;这些会自动继续。
-
@DYZ 不,
walk迭代器明确查看您所做的更改。有关详细信息,请参阅the docs,但 OP 完全正确地执行了该部分:“当 topdown 为True时,调用者可以就地修改 dirnames 列表(可能使用del或切片赋值),而walk()只会递归到名称保留在dirnames 中的子目录;这可用于修剪搜索、强加特定的访问顺序或甚至在调用者再次恢复walk()之前通知walk()调用者创建或重命名的目录。” -
为了澄清一点,我正在遍历产品目录,从固件构建中收集性能数据,以跟踪性能如何变化。我想忽略实验性修复、错误修复、CFI 等以及所有名称中包含 EXP 或“-”的内容。我也不想要像 3.2 这样的旧固件。我想要的固件是 X.X.X.xxx 数字格式,最后一个数字并不总是有 3 位数字——它可以是 1、2 或 3。
标签: python regex directory os.walk