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']
我有一堆遵循此命名约定的目录:
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']