首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >regex和os.walk

regex和os.walk
EN

Stack Overflow用户
提问于 2018-08-03 02:34:43
回答 2查看 758关注 0票数 1

我对蟒蛇很陌生,但学习很快。我试图使用regex和os.walk来忽略我不想处理的目录。我知道您必须修改位置上的dir,而不是创建一个新的列表。不过我两种方法都试过了。我没有发现任何错误,但它仍然遍历所有目录。我试图删除所有目录与'EXP‘或'-’或'3.2‘的名称。下面是一个我想忽略3.2.2.150-20150424.195805_EXP_manuMain_outOfMemFix的例子

这就是我所拥有的:

代码语言:javascript
复制
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...

我的第二个脏东西被忽视了,我做错了什么?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-03 02:43:34

它不会被忽视,只是你的状况总是真实的,所以你没有过滤掉任何东西。

如果发现了某些内容,re.search将返回一个match对象,如果没有找到,则返回None。不管怎样,这不会是dirs的一个元素,因为dirs只是一个字符串列表。所以你所有的测试都是真的。

与其检查搜索是否在dirs中,不如检查它是否真实。( match对象总是真实的,而None总是falsey。)

而且,在修复之后,我确信您希望保留所有测试失败的值--但是您使用的是or而不是and,这意味着在任何测试失败的地方都保留这些值。

所以:

代码语言:javascript
复制
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)]

或者,如果反过来更容易理解--而不是在所有测试失败的地方保存所有值,而是将所有值保存在所有测试都不正确的地方:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-08-03 02:57:23

与使用os.walk不同,您可以避免处理列表操作的开销,方法是在排除符合排除标准的子目录之后,使用os.scandir递归地遍历子目录:

代码语言:javascript
复制
def runtest(filepath_udu: object) -> object:
    for entry in os.scandir(filepath_udu):
        if entry.is_dir() and entry.name not in ('1node', 'local', 'remote') and not re.search(r'\bEXP\b', entry.name) and not re.search(r'\b3.2\b', entry.name) and not re.search(r'\w+(?:- \w+)+', entry.name):
            runtest(entry.path)
        else:
            do something ...
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51664555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档