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

时间:2017-05-30 19:46:14

标签: python regex

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

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']

但正则表达式模式不起作用。有人可以帮我解决这个问题吗?非常感谢先进!

2 个答案:

答案 0 :(得分:2)

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

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在下一个位置不存在时声明为真。

Read more about look-arounds

答案 1 :(得分:2)

此解决方案无需正则表达式 - 您不需要将大炮带入拇指战斗。使用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']

也应该快得多。

如果您不想仅搜索边缘,并且只想过滤掉zip后面没有file_prefix后缀的条目,无论它在字符串中的哪个位置(所以你想匹配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']