如何在discord.TextChannel.purge的check参数中实现正则检查?求示例
使用正则表达式配合discord.TextChannel.purge()过滤消息
完全可以在discord.TextChannel.purge()的check参数中实现正则表达式检查,check参数只需接收一个返回布尔值的可调用对象——lambda表达式或自定义函数都能满足需求,结合re库就能轻松实现消息内容的正则匹配过滤。
以下是两个实用示例:
示例1:用lambda快速匹配正则内容
这个示例会删除频道中最近100条消息里包含邮箱地址的内容:
import discord import re @bot.command() async def purge_emails(ctx): # 预编译正则表达式(提升重复匹配效率) email_pattern = re.compile(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}') # 调用purge,check通过lambda判断消息内容是否匹配正则 deleted_count = await ctx.channel.purge( limit=100, check=lambda msg: email_pattern.search(msg.content) is not None ) await ctx.send(f"已删除 {len(deleted_count)} 条包含邮箱的消息")
示例2:自定义函数实现复杂检查逻辑
如果需要同时结合多个条件(比如排除机器人消息、匹配多组正则),可以用自定义函数替代lambda:
import discord import re def spam_check(msg): # 匹配包含广告关键词的内容,且消息发送者不是机器人 spam_pattern = re.compile(r'(代刷|外挂|抽奖)', re.IGNORECASE) return spam_pattern.search(msg.content) is not None and not msg.author.bot @bot.command() async def purge_spam(ctx): deleted = await ctx.channel.purge(limit=50, check=spam_check) await ctx.send(f"已清理 {len(deleted)} 条垃圾广告消息")
注意事项
- 建议提前用
re.compile()编译正则表达式,避免重复编译带来的性能损耗 check函数的参数是discord.Message对象,除了content,还可以访问author、created_at等属性扩展过滤逻辑- 返回
True的消息会被purge()方法删除,反之则保留
内容的提问来源于stack exchange,提问作者Fy17
相关产品推荐
相关产品推荐

