【问题标题】:How to delete words that do not match exactly the black list due to additional characters in the word?由于单词中的附加字符,如何删除与黑名单不完全匹配的单词?
【发布时间】:2021-01-16 18:36:58
【问题描述】:

我正在制作一个阻止脏话的 Discord 机器人。它可以通过使用下划线和/或附加到脏话的其他符号来绕过。

如何让脚本仍然阻止这些单词但一般不删除字符?

这是我的代码:

import discord
import random
import string
from discord.ext import commands

client = commands.Bot(command_prefix = 'as-')

with open("badwords2.txt") as file:
    bad_words = file.read().splitlines()

def check_if_allowed(text):

    allowed_characters = string.ascii_uppercase + string.ascii_lowercase 
    
    if character not in allowed_characters: 
        return False

    return True
    
@client.event
async def on_message(message):    
    for bad_word in bad_words:
        if bad_word in message.content.lower().split(" "):
            t = discord.Embed(color=0x039e00, title="Message Removed", description=":x:   Please do not swear. Swearing can result in a mute or ban.")
            t.set_footer(text="DM TheSuperRobert2498#2498 for bot suggestions.")
            await message.channel.send(embed=t)
            await message.delete()
            return

    if not check_if_allowed(message.content):
        t = discord.Embed(color=0x039e00, title="Message Removed", description=":x:  Please do not swear. Swearing can result in a mute or ban.")
        t.set_footer(text="DM TheSuperRobert2498#2498 for bot suggestions.")
        await message.channel.send(embed=t)
        await message.delete()
        return


client.run('TOKEN')

【问题讨论】:

    标签: python discord discord.py substring


    【解决方案1】:

    如果我的消息是“大家好,@#@@_badWord@@ 怎么了?” 那么,message.content.lower().split(" ") 就是 ["hey", "guys", "@#@@_badWord@@", "what's", "up?"]

    因此,您可以对正在检查的此列表发挥创意。

    也许会

    [re.sub(r'\W+', ' ', word) for word in content.message.content.lower().split(" ")]
    

    这将创建一个新列表(使用列表理解),其中每个单词都删除了特殊字符(使用 RegEx 替换)

    见:How to remove special characters except space from a file in python?

    我还建议把它做成一个函数,这样你就不必写两次代码了:

    t = discord.Embed(color=0x039e00, title="Message Removed", description=":x:   Please do not swear. Swearing can result in a mute or ban.")
    t.set_footer(text="DM TheSuperRobert2498#2498 for bot suggestions.")
    

    【讨论】:

      【解决方案2】:

      您可以尝试使用re 模块中的re.sub() 函数从单词中删除所有特殊字符:

          clearMessage = re.sub('[^A-Za-z0-9]+', '', message.content))
      

      并删除空格:

          clearMessage = clearMessage.replace(" ","")
      

      如果你把它放在你的代码中,它看起来像这样:

      import random
      import string
      import re
      from discord.ext import commands
      
      client = commands.Bot(command_prefix = 'as-')
      
      with open("badwords2.txt") as file:
          bad_words = file.read().splitlines()
      
      def check_if_allowed(text):
      
          allowed_characters = string.ascii_uppercase + string.ascii_lowercase #creates a string containing all upper- and lower- case letters.
      
          if character not in allowed_characters: #checks if the character is in the set of allowed characters, and returns false if not
              return False
      
          return True #returns true if every character in the input is allowed
          
      @client.event
      async def on_message(message):    
          clearMessage = re.sub('[^A-Za-z0-9]+', '', message.content))
          clearMessage = clearMessage.replace(" ","")
      
          for bad_word in bad_words:
              if bad_word in clearMessage:
                  t = discord.Embed(color=0x039e00, title="Message Removed", description=":x:   Please do not swear. Swearing can result in a mute or ban.")
                  t.set_footer(text="DM TheSuperRobert2498#2498 for bot suggestions.")
                  await message.channel.send(embed=t)
                  await message.delete()
                  return
      
          if not check_if_allowed(message.content):
              t = discord.Embed(color=0x039e00, title="Message Removed", description=":x:  Please do not swear. Swearing can result in a mute or ban.")
              t.set_footer(text="DM TheSuperRobert2498#2498 for bot suggestions.")
              await message.channel.send(embed=t)
              await message.delete()
              return
      

      您不一定需要将您的信息拆分为所有单词。 if something in something 语句还可以搜索原始字符串

      【讨论】:

      • 它可以工作,但如果消息中有大写字母,它不会阻止它。代码有问题吗?我看了看,但从我看来并没有什么问题。
      • 那么请将clearMessage = re.sub('[^A-Za-z0-9]+', '', message.content))替换为clearMessage = re.sub('[^A-Za-z0-9]+', '', message.content)).lower()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多