Discord机器人多行消息处理异常:无法提取指定内容及换行符处理失效
问题:Discord机器人无法读取多行消息内容,提取n值失败
问题场景
我开发了一个Discord机器人,用于追踪频道消息并每24小时推送。目标是提取消息里random item 1和random item 2对应的n值,但当前遇到两个问题:
- 只能访问消息的第一行内容,执行
message.find("Today")返回-1; - 尝试用
message.replace('\n', '')或message.strip("\n")去除换行符均无效——这些方法在常规多行字符串中正常工作,但用x = str(input("paste message"))输入消息时失效。
消息格式示例:
Daily Quest announcement | click here to report a problem
Today's Daily Quest is:
n of random item 1 For 40-50 coins
n random item 2 for 10-20 coins (n取值范围为1到200)
Today's Date:
May 25, 2023
Estimated Final Price:
50 coins
Price Prediction:
slowly Dropping
原因分析
- input()函数的局限性:input()默认仅读取到第一个换行符为止,粘贴多行消息时只会获取第一行,后续内容被直接忽略,因此找不到"Today"关键字。
- 换行符类型不匹配:Discord消息的换行符可能是Windows风格的
\r\n,而非单纯的\n,只替换\n无法彻底清除换行标记,导致字符串处理异常。
解决方案
1. 解决多行输入测试问题
如果用input()测试多行内容,改用sys.stdin.read()读取完整输入:
import sys message = sys.stdin.read()
粘贴多行消息后,按Ctrl+D(Linux/macOS)或Ctrl+Z(Windows)结束输入,即可获取完整的多行内容。
2. 统一处理换行符
处理Discord机器人获取的消息时,同时替换\r和\n:
# 清除所有换行相关字符 cleaned_msg = message.replace('\r', '').replace('\n', '') # 或替换为空格,方便后续文本查找 cleaned_msg = message.replace('\r\n', ' ').replace('\n', ' ')
3. 用正则表达式精准提取n值
无需处理换行,直接用正则匹配目标数字,更可靠:
import re # 匹配两种格式中的n值:"n of random item X" 和 "n random item X" n_pattern = r'(\d+)(?: of)? random item \d' n_values = re.findall(n_pattern, message) if len(n_values) >= 2: item1_n = int(n_values[0]) item2_n = int(n_values[1]) print(f"Item 1的n值:{item1_n},Item 2的n值:{item2_n}")
内容的提问来源于stack exchange,提问作者farahead
相关产品推荐
相关产品推荐

