2016-08-16 60 views
0

我有一个实用程序来删除项目列表,但我想知道如何添加项目的黑名单过滤器不删除。Python如何删除黑名单项目列表不删除

这就是我现在所拥有的,我运行脚本几次,改变项目:行中的“语言”以删除不同的项目。

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

你能澄清是否要被删除或不删除黑名单项目?代码暗示前者,但是你的陈述“我想知道如何添加一个不删除项目的黑名单过滤器”意味着后者。 – Karin

回答

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

请记住,如果你想匹配的全名,你应该在你的正则表达式中使用的开始/结束的字符串正则表达式^$

希望它有助于

+0

谢谢Tomek,只是花了一点消化列表的理解,但真棒回答。 – Victor

2

这是比较简单的创建一个仅他们的名字都在黑名单元素的新列表:

当黑名单中包含的模式,然而,病情可能需要更加复杂。排除匹配任何黑名单模式的项目,一个办法是

projects = [p for p in projects if any(patt.match(p) for patt in blacklist)] 

这将保留匹配模式中的至少一个项目。

+0

我相信OP需要包含黑名单术语的项目作为子字符串被删除。 – Karin

+0

谢谢霍尔登,但是有没有办法用黑名单包含一些类型的模式,而不是确切的名字来保存?说我有像插件释放,插件快照,插件项目??我想保留,并且我想只是使用类似如果project_name包含或project_name像黑名单中的某些东西的条件,不要删除。 ? – Victor

+0

已更新。希望这可以帮助。 – holdenweb

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)行注释掉,并替换为一个项目的字符串表示的打印,以确保你这样做是为了真正删除前合适的项目;)

+0

没有必要使用'any'。实际上,它使算法O(n^2)。如果黑名单是一个集合,你可以只做'如果项目在黑名单中:delete _....',并且它保持O(n) – bgusach

+0

你将如何处理子串? – Karin

+0

@Karin,是的,我确实这样做,但只是希望尽可能小的代码块......(=我已经学会了艰难的方式 – Victor

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)] 
+0

这个解决方案与holdenweb的解决方案有相同的问题OP声明了这个需要和子字符串一起工作 – Karin

+0

为子字符串添加解决方案 – DevShark

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)] 
+0

项目是字符串,但在黑名单(项目保存)我想有子字符串或类型匹配像,不要删除“插件*” – Victor

+0

@维克 - 看我的编辑 –