如何过滤掉带有某些前缀和后缀(扩展名)的文件名?



我有一个这样的文件列表:

file_list = ['file1.zip', 'file1.txt']
file_prefix = 'file1'

我想使用filterre来只得到上面的file1.txt。我正在尝试这个:

regex = re.compile(file_prefix + '.*(!zip).*')
result = list(filter(regex.search, file_list))
# in the above, result should be populated with just ['file1.txt']

但是正则表达式模式不起作用。有人可以帮助我吗?非常感谢提前!

你可以像这样使用负面的前瞻:

regex = re.compile(file_prefix + '(?!.zip)')

法典:

>>> file_list = ['file1.zip', 'file1.txt']
>>> file_prefix = 'file1'
>>> regex = re.compile(file_prefix + '(?!.zip)')
>>> print list(filter(regex.search, file_list))
['file1.txt']

(?!.zip)使它成为一个消极的展望,当.zip不在下一个位置时断言为真。

阅读更多有关环顾的信息

此解决方案不需要正则表达式 - 您无需携带大炮进行拇指战斗。使用 Python 的原生字符串搜索/检查:

file_list = ["file1.zip", "file1.txt"]
file_prefix = "file1"
file_exclude = "zip"
result = [e for e in file_list if e.startswith(file_prefix) and not e.endswith(file_exclude)]
# ['file1.txt']

也应该快得多。

如果您不想只搜索边缘,并且只想过滤掉file_prefix后没有zip后缀的条目,无论它在字符串中的哪个位置(因此您想要匹配some_file1.txt,甚至a_zip_file1.txt,但不是file1_zip.txt),您可以稍微修改它:

file_list = ["file1.zip", "file1.txt", "some_file1.txt", "a_zip_file1.txt", "file1_zip.txt"]
file_prefix = "file1"
file_exclude = "zip"
result = [e for e in file_list if e.find(file_exclude) < e.find(file_prefix)]
# ['file1.txt', 'some_file1.txt', 'a_zip_file1.txt']

最新更新