用于抽搐的原始Python IRC聊天机器人

时间:2016-04-01 16:47:27

标签: python bots irc twitch

我目前正在为Twitch.tv制作IRC机器人,我想知道如何实施禁止的单词列表?这是我到目前为止所得到的,因为我对python的了解有限,我很难过。到目前为止,一切都工作得很好,除了检查消息中是否有被禁止的单词。这是有问题的代码:

if bannedWords.split in message:
                sendMessage(s, "/ban " + user)
                break

我很想查看列表以查看该消息是否包含列表中的任何内容?

bannedWords = ["badword1", "badword1"]

但我只是不确定..

import string
from Read import getUser, getMessage
from Socket import openSocket, sendMessage
from Initialize import joinRoom

s = openSocket()
joinRoom(s)
readbuffer = ""
bannedWords = ["badword1", "badword1"]
while True:
        readbuffer = readbuffer + s.recv(1024)
        temp = string.split(readbuffer, "\n")
        readbuffer = temp.pop()

        for line in temp:
            print(line)
            if "PING" in line:
                s.send(line.replace("PING", "PONG"))
                break
            user = getUser(line)
            message = getMessage(line)
            print user + " typed :" + message
            if bannedWords.split in message:
                sendMessage(s, "/ban " + user)
                break

提前致谢!!

2 个答案:

答案 0 :(得分:4)

假设messagebannedWords都是字符串:

if any(map(message.__contains__, bannedWords.split())):
    ...

如果另一方面,bannedWords已经是一个列表,就像在代码示例中一样,跳过拆分(实际上list类型没有方法split):

if any(map(message.__contains__, bannedWords)):
    ...

这将检查字符串的任何部分是否存在任何禁止的单词; "The grass is greener on the other side."会匹配"ass"等禁止的字词。

请注意map在两个主要python版本之间表现不同:

  • 在Python 2中,map创建了list,这否定了any的短路行为所带来的好处。请改用生成器表达式:any(word in message for word in bannedWords)
  • 在Python 3 map中创建一个迭代器,它将懒惰地将函数应用于给定的iterable。

P.S。

关于bannedWords.split(),通常会看到python中使用多行字符串文字生成的单词列表等,如下所示:

bannedWords = """
banned
words
are
bad
mmkay
""".split()

答案 1 :(得分:1)

如果你想要完全匹配,请使用一组单词,在字符串上调用lower并检查坏单词集是否不相交:

banned_set = {"badword1", "badword2"}
if banned_set.isdisjoint(message.lower().split())
   # no bad words

如果"foo"被禁止且"foobar"完全有效,则使用in/__contains__会错误地过滤这些字词,因此您需要仔细决定要走的路。

如果banned_set.isdisjoint(message.lower().split())评估为True,则可以继续:

In [3]: banned_set = {"badword1", "badword2"}

In [4]: banned_set.isdisjoint("foo bar".split())
Out[4]: True

In [5]: banned_set.isdisjoint("foo bar badword1".split())
Out[5]: False