#python #python-3.x #discord #discord.py #discord.py-rewrite
#python #python-3.x #Discord #discord.py #discord.py-переписать
Вопрос:
Я знаю, как заставить его реагировать на привет, привет и т. Д. Проблема в том, что он будет реагировать, даже если «привет» находится внутри слова, например, «chill», как я могу помешать ему реагировать на сообщения типа «chill». Я пытался использовать пробелы, но они просто в конечном итоге нарушают его еще больше
@bot.listen() #react to messages
async def on_message(message):
if message.guild is not None:
content = message.content
reaction = "👋"
if 'hi' in content.lower():
try:
await asyncio.sleep(1)
await message.add_reaction(f"<{reaction}>")
print(f'added reaction {reaction} {content}')
except Exception as e:
print(f'error adding reaction {reaction} {content}')
Ответ №1:
Это происходит потому, что if 'hi' in content.lower()
вы смотрите, найдена ли строка hi
внутри строки message.content
. Лучшим способом решения этой проблемы было бы использование регулярных выражений (регулярных выражений).
Вы могли бы создать функцию, подобную следующей, которая будет проверять, найдена ли строка, переданная в качестве параметра, в другой строке. Разница с тем, что вы сделали, заключается в том, что этот метод включает слово в b
теги регулярных выражений, которые обозначают границы слов, это позволяет нам искать только целые слова.
import re
def findCoincidences(w):
return re.compile(r'b({0})b'.format(w)).search
Вы могли бы просто добавить это в свой код и использовать его следующим образом:
# ...
if findCoincidences('hi')(content.lower()):
try:
await asyncio.sleep(1)
await message.add_reaction(f"<{reaction}>")
print(f'added reaction {reaction} {content}')
except Exception as e:
print(f'error adding reaction {reaction} {content}')
По сути, эта новая findCoincidences()
функция вернет нам re.Match
объект, если он найдет слово «привет» в содержимом сообщения, поэтому оно войдет в try
инструкции.