【问题标题】:Issue with split() using maxsplit使用 maxsplit 的 split() 问题
【发布时间】:2017-10-20 13:58:03
【问题描述】:

我确定这是非常基本的问题,我正在尝试设置一个 !status 命令来更改我的机器人的状态。以下代码有效:

@myBot.event        
async def on_message(message):
 if message.content.startswith('!status'):
   m = message.content.split(' ')
   await myBot.change_presence(game=discord.Game(name=m[1]))

所以这里没什么复杂的,它会将机器人的状态设置为我在!status 之后输入的任何内容。

但是,它会在第一个空格之后停止,因为我使用 m[1] 没有 maxsplit。现在,如果我将maxsplit=1 添加到我的split() 函数中,我可以得到m[1] 中第一个空格之后的所有内容。这看起来很完美,对吧?假设我只是输入了和以前一样的东西,比如!status test,奇怪的是,它不起作用,即使m[1] 只包含test,状态也不会更新。为什么? maxsplit=1 真正改变了我无法用 print(m[1]) 看到的哪些变化?

【问题讨论】:

  • 尾随空格/换行符?
  • @user1620443 你能详细说明一下吗?我尝试将实际输出写入文件,m[1] 的末尾没有任何空格,也没有任何换行符。至少我不能在文本文件中看到...
  • m = message.content[7:].strip() 因为你已经知道消息以!status开头
  • 你能加一个minimal reproducible example吗?不需要await 和复杂检查的东西(即message.author.server_permissions.manage_messages)。只需用一个简单的字符串和split 来演示您的问题 - 这将是完美的。
  • @dnLL 我们无法重现您的问题,因为如果没有整个机器人程序,您的代码将无法执行。一个最小的例子是 content = 'the message as you really got it',这样我们就可以立即比较 split 的输出有或没有 maxsplit

标签: python string python-3.x discord discord.py


【解决方案1】:

如果没有maxplit,您将没有第一个空格之后的所有内容,那么m[1] 只是包含第一个和第二个空格之间的所有内容(如果存在)。

只有一个空格,它们是相同的:

>>> str1 = '!status test'
>>> str1.split()
['!status', 'test']

>>> str1.split(maxsplit=1)
['!status', 'test']

但不止一个他们不是:

>>> str2 = '!status test debug'
>>> str2.split()            # 3 elements
['!status', 'test', 'debug']

>>> str2.split(maxsplit=1)  # 2 elements
['!status', 'test debug']

我认为你真正想要的是去掉!status

>>> str1[len('!status '):]  # or hardcode the length: `[8:]`
'test'

>>> str2[len('!status '):]
'test debug'

或者更简单的str.partition:

>>> str1 = '!status test'
>>> str2 = '!status test debug'
>>> str1.partition(' ')
('!status', ' ', 'test')
>>> str2.partition(' ')
('!status', ' ', 'test debug')

第三个元素总是包含第一个空格之后的所有内容。您甚至可以检查第一个元素 == '!status'

【讨论】:

  • 实际上,它使用split(maxsplit=1)split(' ') 可以完美运行,但使用split(' ',maxsplit=1) 将无法正常工作,即使m[1] 在使用!status test 作为输入。对此有什么想法?不过我最初的问题已经解决了。
  • 考虑到我收到的所有反对票和关闭请求,我可能会删除。我还是觉得很有趣。
  • 你能显示repr(message.content)type(message.content)吗?我认为这也会使问题更清楚,也许一些反对者会推翻反对票。
  • 如果我打印(repr(message.content)),我得到'!status test'。我正在使用最新版本的 Python (AFAIK)。问题只是当我添加 ' ' 参数时(这是强制性的,当它是我读到的空格但我也读到的行为有点不同)。
  • 是的,' ' 只在' ' 处拆分,而没有' ' 它在每个空格处拆分(包括制表符、换行符等)。但是,您给定的字符串似乎 应该 以任何方式工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
相关资源
最近更新 更多