Python Discord DnD机器人:实现无空格运算式的运算符自动分隔
Python Discord DnD机器人:实现无空格运算式的运算符自动分隔
看起来你已经搞定了带空格的骰子运算解析,现在卡在无空格的表达式处理上对吧?我之前做类似DnD机器人的时候也踩过这个坑,一个个运算符循环判断太繁琐,还容易出边界问题——其实用正则表达式就能轻松解决,一次性搞定所有运算符的空格补全。
先说说你现有代码的问题:逐个字符检查运算符前后的空格,不仅要处理多种运算符,还要担心索引越界(比如运算符在表达式开头/结尾时,e-1或e+1会报错),效率也不高。换正则的话,几行代码就能完成所有运算符的空格包裹,再处理下重复空格就完美了。
给你个直接能用的解决方案,结合你的需求调整的:
import re # 示例输入,模拟用户发送的命令 prompt = "!roll 2d8 + d20 /d4+ d6" # 定义需要处理的运算符集合,注意转义正则里的特殊字符(+、*、/这些) operators_pattern = r'(\+|\-|\×|\÷|\/|\<|\>|\%|\*)' # 第一步:给每个运算符前后加上空格 formatted_prompt = re.sub(operators_pattern, r' \1 ', prompt) # 第二步:把连续的多个空格替换成单个(避免原来已有空格的地方变成多重空格) formatted_prompt = re.sub(r'\s+', ' ', formatted_prompt) print(formatted_prompt) # 输出:!roll 2d8 + d20 / d4 + d6
如果是无空格的输入比如!roll d6+d6×d20,处理后会直接变成!roll d6 + d6 × d20,完全符合你需要的格式。
把这个逻辑整合到你的Discord Bot里也很简单,比如用discord.py的话:
import discord from discord.ext import commands import re bot = commands.Bot(command_prefix='!', intents=discord.Intents.all()) @bot.command() async def roll(ctx, *, expression): # 处理表达式,补全运算符前后的空格 operators_pattern = r'(\+|\-|\×|\÷|\/|\<|\>|\%|\*)' formatted_expr = re.sub(operators_pattern, r' \1 ', expression) formatted_expr = re.sub(r'\s+', ' ', formatted_expr) # 这里把formatted_expr传给你原来的骰子解析逻辑就行 await ctx.send(f"已转换表达式:`{formatted_expr}`") # 记得替换成你的bot token bot.run('YOUR_BOT_TOKEN')
这个方法的好处是:
- 一次性处理所有你列出的运算符,不用逐个写if判断
- 自动处理边界情况(比如运算符在表达式开头/结尾,虽然你的场景里不太会出现,但正则也能安全处理)
- 兼容已有空格的输入,不会破坏原来的格式,只会统一规范成“运算符前后各一个空格”的样式
要是你对正则不太熟悉,简单解释下:
(\+|\-|\×|\÷|\/|\<|\>|\%|\*):用括号把所有运算符包起来,作为一个捕获组,每个特殊运算符前面加\转义(因为它们在正则里有特殊含义)re.sub(..., r' \1 ', ...):把捕获到的运算符(\1代表第一个捕获组)替换成“空格+运算符+空格”re.sub(r'\s+', ' ', ...):把一个或多个连续空格替换成单个空格,保证格式整洁
这样你就不用再逐个运算符去循环判断了,直接用这个逻辑就能把所有无空格的表达式转换成你原来能处理的格式~
备注:内容来源于stack exchange,提问作者ginger__tree
相关产品推荐
相关产品推荐

