我有一个这样的文件列表:
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']
但是正则表达式模式不起作用。有人可以帮助我吗?非常感谢提前!
你可以像这样使用负面的前瞻:
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']