正则表达式和os.walk

我是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 [:]被忽略了,我在做什么错?谢谢


Qyouu
浏览 187回答 2
2回答

冉冉说

它不会被忽略,只是您的条件始终为真,因此您不会过滤掉任何内容。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))]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python