为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式和os.walk

正则表达式和os.walk

Qyouu 2021-05-14 18:09:16
我是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))]


查看完整回答
反对 回复 2021-05-18
  • 2 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信