【问题标题】:Check if string (or split string) contains any words from list检查字符串(或拆分字符串)是否包含列表中的任何单词
【发布时间】:2015-08-10 16:41:06
【问题描述】:

我有一个 Twitter 机器人需要忽略包含某些列入黑名单的词的推文。

这可行,但前提是推文中的单词与黑名单中的单词完全相同。

timeline = filter(lambda status: not any(word in status.text.split() for word in wordBlacklist), timeline)

我想确保推文无法通过在单词周围放置符号或添加其他字符来绕过这一点,例如通过在单词末尾附加“book”来绕过列入黑名单的单词“face”,例如“facebook” .

如何以适合我的过滤器 lambda 的方式执行此操作?

【问题讨论】:

  • 听起来像是正则表达式的工作。
  • “放符号”是什么意思?
  • 一个带有预期输出的示例会更合适。
  • @J0HN 对不起,我不是说用符号替换字符,只是附加它们。
  • 没什么可抱歉的 - 我要求澄清,您有时间就回复了。每个人都很高兴:)

标签: python arrays string list


【解决方案1】:

您可以在这里使用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)

如果word 可以包含一些转义字符,您也可以使用re.escape() 而不是word

如果您也期待symbols,请尝试

timeline = filter(lambda status: not any(re.findall(r"\S*"+word+r"\S*",status.text) for word in wordBlacklist), timeline)

【讨论】:

  • 它对“放置符号”有何帮助?如果我确实理解 OP 的意图,b0tbot 应该被视为同一个词。但我可能会犹豫。
  • 我希望看到一个小的基于正则表达式的修复,即使 OP 没有提到这一点。我的意思是使用数字、标点符号和其他东西而不是字母,也就是 l33t sp3/\k。
  • @J0HN 如果单词是 bot 并且文本有 sdfdbot213123 这可以被检测到...我已经对其进行了编辑.....但是将 bot 更改为 b0t 很难考虑到会有很多场景
  • 这正是我的意思。 :) OP 还没有回答我关于他到底是什么意思的问题,所以等待答案可能是有意义的。
  • @J0HN 到目前为止,根据 OP 显示的简单示例,此答案仍然有效 :)
【解决方案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))

【讨论】:

    【解决方案3】:

    您可以使用列表推导代替过滤器,这是相同的想法,语法略有不同,然后使用正则表达式进行过滤,因为您的示例超出了字符串操作的能力:

    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”将被阻止,因为它匹配“face”,“friendly”将被阻止,因为它包含“friend”等等。但是,您将需要对诸如“f*acebook”或其他技巧之类的东西更感兴趣——这些目前会绕过过滤器。尝试正则表达式并熟悉它们,你真的可以制作出漂亮的过滤器。 Here is a good practice site for regex.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      相关资源
      最近更新 更多