我目前正在为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
提前致谢!!
答案 0 :(得分:4)
假设message
和bannedWords
都是字符串:
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版本之间表现不同:
map
创建了list
,这否定了any
的短路行为所带来的好处。请改用生成器表达式:any(word in message for word in bannedWords)
。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