我有一个删除项目列表的实用程序,但我想知道如何添加不删除项目的黑名单过滤器。
这就是我现在所拥有的,我运行脚本几次更改if" Languages"在项目中:删除不同项目的行。
def delete_projects():
projects = get_projects()
# black_list = [some list of projects that I would like to delete but don't have an exact file name (i.e. "order-*")]
for project in projects:
if "Languages" in project:
delete_project(project)
我想这样做,这样我就可以获得项目列表并使用black_list检查名称为LIKE xyz *的项目,而不是删除。我怎么能这样做?
谢谢!
更新:这只是我目前的实施思路。使用正则表达式实现它并删除与正则表达式不匹配的项目会更好吗?如果可以的话,我需要正则表达式的帮助。
答案 0 :(得分:2)
创建一个只包含名称在黑名单中的元素的新列表相对简单:
projects = [project for project in projects if project not in blacklist]
但是,当黑名单包含模式时,条件可能需要更复杂。排除与任何黑名单模式匹配的项目的一种方法是
projects = [p for p in projects if any(patt.match(p) for patt in blacklist)]
这将保留至少与其中一种模式匹配的项目。
答案 1 :(得分:0)
您可以使用Python any
:
BLACKLIST = {'languages'}
def delete_projects():
projects = get_projects()
for project in projects:
if any(term in project for term in BLACKLIST):
delete_project(project)
顺便说一句,我强烈建议首先运行带有delete_project(project)
行注释掉的代码并替换为项目字符串表示的打印,以确保在执行之前删除正确的项目真实的;)
答案 2 :(得分:0)
你可以像这样使用list comprehension:
projects = [p for p in get_projects() if p in to_keep]
如果要选择不在列表中的对象,请执行以下操作:
projects = [p for p in get_projects() if p not in to_exclude]
请注意,这适用于完全匹配。如果要处理子字符串,可以执行以下操作:
projects = [p for p in get_projects() if not any(substr in p for substr in to_exclude)]
答案 3 :(得分:0)
import re
black_list_of_regex = ['order-.*', 'normal_name']
print([project for project in projects for reg in black_list_of_regex if re.match(reg, project)])
请记住,如果您想匹配全名,则应在正则表达式中使用开始/结束字符串regexp ^
,$
希望有所帮助
答案 4 :(得分:0)
如果projects
是字符串,并且您有blacklist
,那么您可以这样做:
set(projects) - set(blacklist)
您可以通过以下方式创建黑名单:
blacklist = [project for project in projects if 'Languages' in project]
另一个选项,没有黑名单
filter(lambda project: "Languages" not in project, projects)
修改强>
如果您需要保存具有特定模式的项目,我会使用正则表达式:
import re
pattern = '^XYZ.*'
projects = [project for project in projects if re.search(pattern, project)]
如果你有一个单词黑名单,那么你可以这样做:
projects = [project for project in projects if any(pat in project for pat in blacklist)]