我有一个像这样的文件列表:
file_list = ['file1.zip', 'file1.txt']
file_prefix = 'file1'
我想使用filter
和re
来获取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']
但正则表达式模式不起作用。有人可以帮我解决这个问题吗?非常感谢先进!
答案 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
在下一个位置不存在时声明为真。
答案 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']