将过滤器应用于列表时如何找到模式?

How can I find patterns when applying a filter to a list?

我正在应用过滤器来查找符合某些条件的文件夹列表。

例如,当我有几个文件夹的名称类似于 a_1_1_1 时,a_2_2_2 我会

folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)) and x[1]=='_', os.listdir(d)))

其中 d 是基本文件夹。

然后,如果我有一些包含多个子文件夹的文件夹,其名称如 ab_1_1_1 和 ab_1_2_3 我必须用

更改以上内容
folders = list(filter(lambda x: os.path.isdir(os.path.join(d, x)) and x[2]=='_', os.listdir(d)))

这很麻烦而且不笼统,所以我想用更笼统的东西替换 x[n]=='_' 条件' 例如列出具有三个 _ 的文件夹,在 _.

如何将这种模式引入到表达式中? (我听说过正则表达式,但我不知道怎么做)

一个实现可能是在 "_" 上使用 split 并查看你得到的长度是否为 4 所有(除了第一个拆分部分)都是使用 all 的数字:

out = list(filter(lambda x: os.path.isdir(os.path.join(d, x)) and len(x.split('_'))==4 and all(i.lstrip('-').isdigit() for i in x.split('_')[1:]), os.listdir(d)))

但我认为使用 for-loop 而不是 filter 来编写它可能更具可读性:

out = []
for x in os.listdir(d):
    if os.path.isdir(os.path.join(d, x)):
        s = x.split('_')[1:]
        if len(s) == 3 and all(i.lstrip('-').isdigit() for i in s):
            out.append(x)