我是python的新手,但学习速度很快。我正在尝试将regex与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...我的第二个Dirs [:]被忽略了,我在做什么错?谢谢
2 回答
冉冉说
TA贡献1877条经验 获得超1个赞
它不会被忽略,只是您的条件始终为真,因此您不会过滤掉任何内容。
re.search如果找到某对象,则返回匹配对象,否则返回一个匹配对象None。无论哪种方式,都不会成为的元素dirs,因为dirs它只是一个字符串列表。因此,您的所有测试始终都是正确的。
不必检查搜索不在其中dirs,而只需检查它是否不正确。(匹配对象始终是真实的,并且None始终是虚假的。)
另外,在解决此问题之后,我非常确定您希望将所有测试失败的值保留在其中,但是您使用or而不是and,这意味着您将在所有测试失败的值保留在其中。
所以:
dirs[:] = [dir for dir in dirs
if not re.search(r'\bEXP\b', dir)
and not re.search(r'\b3.2\b', dir)
and not re.search(r'\w+(?:-\w+)+', dir)]
或者,如果更容易理解(相反),而不是将所有值都保留在所有测试失败的地方,而是将所有值保留在所有测试都不成立的地方:
dirs[:] = [dir for dir in dirs if not (
re.search(r'\bEXP\b', dir) or
re.search(r'\b3.2\b', dir) or
re.search(r'\w+(?:-\w+)+', dir))]
添加回答
举报
0/150
提交
取消