【问题标题】:os.walk and some testsos.walk 和一些测试
【发布时间】:2009-10-22 15:37:11
【问题描述】:

我不确定我是否正确理解 os.walk 如何存储其结果。

我正在尝试执行以下操作:

我正在为后续文件夹检查根文件夹。有数百个 em,它们以某种统一的方式嵌套。

我正在尝试检查每个子文件夹,如果它以四位数字结尾,请将其存储在一个列表中。

我使用了高度程序化的代码,并且得到了它,但代码使用的是 os.listdir,这意味着我需要为我想要的每个文件夹执行该函数。

有没有更好的办法?

def ListadorPastas(pasta):

    resultado = []

    regex = "^[0-9]{4}"
    padrao = re.compile(regex)

    for p in os.listdir(pasta):
        regexObject = re.match(padrao,p[-4:])
        if (regexObject!=None):
            resultado.append(regexObject.string)
        else:
            pass
    return resultado

另外,我有一个正则表达式问题:这个正则表达式匹配表达式的最后四个切片数字。有时我最后有 5 位数字的文件夹,这也将匹配。我尝试使用 "$[0-9]{4}" 但它什么也没给我。任何想法为什么?

提前致谢。

乔治

【问题讨论】:

  • 每个问题只提出一个问题,而不是两个完全不相关的问题(在 os.walk 和 regex 上)恰好涉及您的同一段代码,这真的会更有礼貌,使对于试图回答的人和将来寻找答案的读者来说,生活会更轻松(每个问题都可以正确命名和标记,从而进行搜索等)。
  • 我需要检查无数个文件夹,并测试它们最后是否有四位数。如果是这样,请将它们添加到列表中。我遇到了麻烦,因为我的功能需要在许多文件夹中重复。我在想一些更通用和自动化的东西。

标签: python regex directory


【解决方案1】:

使用 "$[0-9]{4}" 但它返回给我 没有什么。任何想法为什么?

$ 表示正则表达式模式中的结尾(行或字符串),所以我想知道您如何期望“字符串结尾然后四位数字”可能匹配任何内容......?根据“结束”的定义,它后面不会跟着 4 位数字! r'(^|\D)\d{4}$' 应该会更好,如果我理解你想要的,匹配只有 4 位数字的字符串,或者正好以 4 位数字结尾,而不是 5 位或更多(\D 表示非数字,就像 \d 表示数字 - - 没有理由使用[0-9][^0-9]!)。

os.walk 不需要存储太多——在它正在行走的隐式树上的几个指针——但是你为什么关心它是如何在内部实现的呢?就用它吧……:

def ListadorPastas(pasta):
    resultado = []
    for root, dirs, files in os.walk(pasta):
        for d in dirs:
          if (len(d)==4 or len(d)>4 and not d[-5].isdigit()
             ) and d[-4:].isdigit():
              resultado.append(d)
    return resultado

我还借此机会展示了一种非正则表达式的方式来对子目录的名称进行您想要的检查。

【讨论】:

    【解决方案2】:

    关于正则表达式:如果您使用p[-4:],您将始终查看p 的最后四个字符,因此您没有机会查看是否真的有五个。

    所以改为使用

    regex = "(?<![0-9])[0-9]{4}$"
    padrao = re.compile(regex)
    
    regexObject = re.search(padrao, p)
    

    re.search 也会匹配部分字符串。

    【讨论】:

    • 您的正则表达式对于正好是 4 位数字的字符串(之前没有任何内容)将失败:您需要在 4 位数字然后字符串结尾(请参阅我的答案以获取有关此内容的详细信息以及更多信息)。
    • 是的,我在发布后也注意到了这一点 - 只是更正了它,因为它还返回一个不同长度的匹配对象。现在,通过lookbehind,它应该表现得像海报的解决方案(但满足“只有四位数字”的要求)
    【解决方案3】:

    你应该使用的正则表达式是:

    pattern = re.compile(r'(?<!\d)\d{4}$')
    re.search(pattern, p)
    

    至于os.walk你的解释并不完全清楚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多