Python 使用 Regex 的 Glob 原始目录

Python Glob Orignal Directories using Regex

我有一堆遵循此命名约定的目录:

foo
foo.v2
foo_v01
foo_v02
foo_v03
bar
bar.v3
bar_v01
bar_v02

我正在寻找一个正则表达式来只匹配原始目录(foo 和 foo_v01;bar 和 bar_v01)。我正在使用 pathlib 中的 Path.glob(pattern) 来 glob 文件。我想专门按名称而不是时间戳对原始目录进行 glob。

这适用于您的示例(如果它不适用于其他人,请将它们添加到您的问题中)

r'^(?!\w+_v0[2-9])(\w+)$'

解释:

(\w+)表示匹配字母、下划线、数字任意组合一次或多次。

(?!\w+_v0[2-9]) 表示如果它匹配任何与上面相同的组合,然后是 _v0<any_number_from_2_to_9> (版本高于 1),它应该丢弃匹配。

Glob patterns (which utilize fnmatch under the hood) are not regular expressions 并且比正则表达式更受限制。

这是另一种方法,实际上是使用正则表达式来执行过滤:

import os
import re

ROOT_DIR = "./dirs"
FILTER_RE = r"[._]v\d*[2-9]$"

filtered_dirs = [d for d in os.listdir(ROOT_DIR) if not re.search(FILTER_RE, d)]

print(sorted(filtered_dirs))

这是输出:

$ ls dirs
bar  bar.v3  bar_v01  bar_v02  foo  foo.v2  foo_v01  foo_v02  foo_v03

$ python3 filter_dirs.py
['bar', 'bar_v01', 'foo', 'foo_v01']