我有一个Twitter机器人,需要忽略包含某些黑名单的推文。
这是有效的,但前提是推文中的字词与列入黑名单的字词完全一致。
timeline = filter(lambda status: not any(word in status.text.split() for word in wordBlacklist), timeline)
我想确保推文不能通过在单词周围添加符号或添加其他字符来绕过这一点,例如绕过列入黑名单的单词" face"通过附加" book"到最后,就像这样" facebook"。
如何以适合我的过滤器lambda的方式执行此操作?
答案 0 :(得分:3)
您可以在此处使用re
。
import re
timeline = filter(lambda status: not any(re.findall(r"[a-zA-Z0-9]*"+word+r"[a-zA-Z0-9]*",status.text) for word in wordBlacklist), timeline)
如果re.escape()
可以包含一些转义字符,您也可以word
使用word
如果您也期望symbols
,请尝试
timeline = filter(lambda status: not any(re.findall(r"\S*"+word+r"\S*",status.text) for word in wordBlacklist), timeline)
答案 1 :(得分:2)
您可以根据黑名单构建正则表达式:
from itertools import ifilterfalse
import re
wordBlacklist = ['face', 'hello']
r = re.compile('|'.join(map(re.escape, wordBlacklist)))
...
timeline = list(ifilterfalse(lambda status: r.search(status.text), timeline))
答案 2 :(得分:1)
您可以使用列表推导而不是过滤器,这可以使用略有不同的语法,然后使用正则表达式进行过滤,因为您的示例超出了字符串操作的功能:
import re
blacklist = re.compile('face|friend|advertisement')
timeline = [word for word in status.split() if not blacklist.search(word)]
# filter version of this command:
timeline = filter(lambda word: not blacklist.search(word), status.split())
现在,时间轴会返回一个与您的黑名单中没有任何匹配的字词列表,因此" facebook"将被阻止,因为它匹配"面对","友好"会被阻止,因为它包含了"朋友"等等。但是,你需要得到更好的东西,例如" f * acebook"或其他技巧 - 这些将绕过目前的过滤器。尝试使用正则表达式并熟悉它们,你可以真正做出漂亮的过滤器。 Here is a good practice site for regex.