Скажем, например, у меня есть это:

import discord, asyncio, time

client = discord.Client()

@client.event
async def on_message(message):
    if message.content.lower().startswith("!test"):
        await client.send_message(message.channel,'test')

client.run('clienttokenhere')

Я хотел бы быть в состоянии сделать 2 вещи:

1) Сделайте так, чтобы, если и только если пользователь вводит точно !test и ничего больше, он будет распечатывать test в канале

2) Сделайте так, чтобы, если пользователь сначала набрал !test, а затем пробел and at least one other string character, it wlll print out test - так для примеров: a) !test ничего не распечатывает, b) {{X3 }} (!test с последующим одним пробелом) ничего не распечатывает, c) !test1 ничего не распечатывает, d) !testabc ничего не распечатывает, но e) {{ X7}} распечатает test, f) !test 123abc распечатает test, g) !test a распечатает test и h) {{X13 }} распечатает test и т. д.

Я знаю только о startswith и endswith, и, как показывает мое исследование, такого понятия как exact не существует, и я не уверен, как сделать так, чтобы для него требовалось минимальное число символы после startswith

0
user152294 28 Май 2017 в 16:26

2 ответа

Лучший ответ

Используйте оператор ==.

1) Печать теста, когда в полученной строке есть только !test

if message.content.lower() == '!test':
    await client.send_message(message.channel,'test')

2) Выведите test, за которым следует строка, за которой следует строка

# If it starts with !test and a space, and the length of a list
# separated by a space containing only non-empty strings is larger than 1,
# print the string without the first word (which is !test)

if message.content.lower().startswith("!test ") 
   and len([x for x in message.content.lower().split(' ') if x]) > 1:
    await client.send_message(message.channel, 'test ' + ' '.join(message.content.split(' ')[1:]))
0
Pedro von Hertwig Batista 28 Май 2017 в 13:50

Похоже, вам нужно регулярное выражение вместо startswith(). И у вас, кажется, есть два противоречивых требования:

1) Сделайте так, чтобы, если и только если пользователь вводит точно !test и ничего больше, он будет распечатывать test в канале

2a) !test ничего не распечатывает

Включая 1 и исключая 2а:

import re
test_re = re.compile(r"!test( \S+)?$")
# This says: look for
# !test (optionally followed by one space followed by one or more nonspace chars) followed by EOL
# 

@client.event
async def on_message(message):
    if test_re.match(message.content.lower()):
        await client.send_message(message.channel,'test')

Включая 2a и исключая 1, подставьте эту строку (пробел и прочее после !test больше не являются обязательными):

test_re = re.compile(r"!test \S+$")
0
BoarGules 28 Май 2017 в 13:48