排除特定文件的模式

pattern to exclude specific files

我正在尝试创建正则表达式,它将列出某些目录中的所有 .jpg,除了几个文件(静态,不是模式)。

所以,我写了这个:(Python)

"^(?!358097_sat!823133_sat!140860_sat).*jpg$"
"^(?!358097_sat|823133_sat|140860_sat).*jpg$"

我想列出所有 JPEG 文件,除了:

但是它给我一个错误,说没有找到匹配这个模式的文件。

这是完整的字符串和错误消息:

No files matched pattern: ../input/dataset/valid/^(?!358097_sat!823133_sat!140860_sat).*jpg$

我实际上是将此正则表达式传递给 tf 函数:

tf.data.Dataset.list_files(dataset_path + val_data + "^(?!358097_sat|823133_sat|140860_sat).*jpg$", seed=SEED)
# dataset_path = "../input/dataset/"
# val_data = "valid/"

完全错误:

*InvalidArgumentError:预期 'tf.Tensor(False, shape=(), dtype=bool)' 为真。汇总数据:b'没有文件匹配模式:../input/dataset/valid/^(?!358097_sat|823133_sat|140860_sat).jpg$'

这里是函数参考:https://www.tensorflow.org/api_docs/python/tf/data/Dataset#list_files

静态方法 list_files 需要包含 globs 而非 正则表达式的字符串或字符串列表。 另见 filename matching

使用 globs 的文件名匹配无法取消匹配。所以你将不得不编写一个自定义函数来做到这一点。

您可以使用例如glob.glob() 生成 JPEG 文件列表,然后筛选出与您的字符串匹配的文件。

ignore = ("358097_sat", "823133_sat", "140860_sat")

files = [f for f in glob.glob("*.jpg") if not any(j in f for j in ignore)]