如果列表中包含“黑名单”中的子字符串,则从列表中删除该项目

用户名

在python中,我想从列表中删除任何包含在所谓的“黑名单”中找到的子字符串的字符串。

例如,假定列表A为以下内容:

A = [ 'cat', 'doXXXg', 'monkey', 'hoBBBrse', 'fish', 'snake']

清单B是:

B = ['XXX', 'BBB']

我如何获得列表C:

C = [ 'cat', 'monkey', 'fish', 'snake']

我玩过各种正则表达式和列表理解的组合,但似乎无法正常工作。

马丁·彼得斯(Martijn Pieters)

您可以将黑名单加入一个表达式中:

import re

blacklist = re.compile('|'.join([re.escape(word) for word in B]))

然后过滤出匹配的单词:

C = [word for word in A if not blacklist.search(word)]

模式中的单词会被转义(这样,.其他元字符就不会被这样处理,而是视为文字字符),并加入一系列|替代项中:

>>> '|'.join([re.escape(word) for word in B])
'XXX|BBB'

演示:

>>> import re
>>> A = [ 'cat', 'doXXXg', 'monkey', 'hoBBBrse', 'fish', 'snake']
>>> B = ['XXX', 'BBB']
>>> blacklist = re.compile('|'.join([re.escape(word) for word in B]))
>>> [word for word in A if not blacklist.search(word)]
['cat', 'monkey', 'fish', 'snake']

这应该胜过任何显式的成员资格测试,尤其是随着黑名单中单词数量的增加:

>>> import string, random, timeit
>>> def regex_filter(words, blacklist):
...     [word for word in A if not blacklist.search(word)]
... 
>>> def any_filter(words, blacklist):
...     [word for word in A if not any(bad in word for bad in B)]
... 
>>> words = [''.join([random.choice(string.letters) for _ in range(random.randint(3, 20))])
...          for _ in range(1000)]
>>> blacklist = [''.join([random.choice(string.letters) for _ in range(random.randint(2, 5))])
...              for _ in range(10)]
>>> timeit.timeit('any_filter(words, blacklist)', 'from __main__ import any_filter, words, blacklist', number=100000)
0.36232495307922363
>>> timeit.timeit('regex_filter(words, blacklist)', "from __main__ import re, regex_filter, words, blacklist; blacklist = re.compile('|'.join([re.escape(word) for word in blacklist]))", number=100000)
0.2499098777770996

上面的测试针对1000个随机单词(长度为3-20个字符)列表中的10个随机列入黑名单的短单词(2-5个字符),正则表达式快50%。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果项目包含黑名单中的条目,则从列表中删除项目

如果项目与子字符串不匹配,则从列表中删除该项目,而不考虑其格式

如果列表中包含子字符串,则从字符串中删除子字符串

如果字符串包含指定字符,则从列表中删除字符串

如果来自另一个对象的字符串包含子字符串,则从列表中删除项目

字符串中的PHP黑名单单词

如果键包含字符串列表中的字符串,则从字典列表中删除条目

从字符串中删除列入黑名单的术语,然后消除不必要的空格

Python pandas 数据框:在数组列中,如果第一个项目包含特定字符串,则从数组中删除该项目

Python如果列表中的项目在字符串中,则该项目是什么?

清理数据:如何遍历列表查找项目是否包含字符串,空格或空格,然后在Python中删除该项目

如果项目包含来自另一个列表的字符串,则从一个列表中删除它们

如果匹配列表中存在的元素,则从字符串中提取子字符串

C#如果属性在列表<字符串>中,则从列表<T>删除所有项

Linux:如果字符串在列表中的其他地方有子字符串,则从列表中删除它们

从包含特定子字符串的列表中删除项目?

从嵌套列表中删除包含特定字符串的项目

如果子列表包含给定元素,则从列表中删除子列表

如果列表之间未共享,则从列表中删除项目

从类列表中包含的列表中删除字符串

当两者部分重叠时如何匹配白名单中的字符串而不是黑名单中的字符串

Python从列表中删除包含其他列表中的子字符串的元素

如果项目不在列表中,我想将其推送。如果该项目已在列表中,则删除该项目

黑名单数组火花数据帧中字符串值的一部分

使用多个正则表达式检查字符串中是否存在列入黑名单的模式

如果列表包含子字符串,如何插入到列表中 - WEB API

如果黑名单中没有字母,则返回true

如果列在Pandas中包含任何字符串值,则从数据框中删除值

如果字典包含禁止值,则从列表中删除字典