#python #regex #list #discord #discord.py
Вопрос:
Я все еще изучаю Python и работаю над ботом для своего сервера Discord. Я хочу сделать команду, чтобы проверить доступность скина (элемента) из моего списка (cat.json).
Поэтому друг порекомендовал мне использовать регулярное выражение для идентификации элемента, и это сработало так, как должно.
Я хочу применить правила к этой системе (if/else), но когда я использую if/else, команда больше не работает правильно…
Вот мой код:
class Cat(commands.Cog): # cog
def __init__(self, client): # cog setup.
self.client = client
@commands.command( # command to check the skin in the list.
name="skin",
aliases=["s"]
)
async def skin(self, ctx, skin):
list_ = json.load(open("cogs/cat.json")) # ['battle queen katarina', 'katarina 02', 'graves 01']
r = re.compile(f".*{skin}") # regex filter.
newlist = list(filter(r.match, list_)) # newlist = filtred regex list.
if skin in newlist: # if skin (command) is in newlist:
await ctx.channel.send(newlist) # send the new list.
else:
await ctx.channel.send(f'your skin ({skin}) is not available.')
def setup(client):
client.add_cog(Cat(client)) # cog
Команда: !s катарина
'your skin (katarina) is not available.'
Ожидаемый:
Команда: !s катарина
['battle queen katarina', 'katarina 02']
Было бы идеально, если бы он вернулся вот так:
'Katarina available skins: Battle Queen Katarina, Katarina 02'
Комментарии:
1. Регулярное выражение не является подходящим решением для этой проблемы. В Python есть
in
ключевое слово, которое вы можете использовать, чтобы проверить, встречается ли ключевое слово в данном имени.2. Я бы больше работал над этим шаблоном регулярных выражений… Вы можете поэкспериментировать, используя regex101.com
Ответ №1:
Для вашего случая я сделаю это, используя in
вместо regex
, вот первый случай:
@commands.command( # command to check the skin_input in the list.
name="skin_input",
aliases=["s"]
)
async def skin(self, ctx, skin_input):
skin_list = ['battle queen katarina', 'katarina 02', 'graves 01']
newlist = list() # store target skin
for skin_item in skin_list:
if skin_input in skin_item: # if "katarina" in skin_item
newlist.append(skin_item) # add it into list
if len(newlist) == 0:
await ctx.channel.send(f'your skin_input ({skin_input}) is not available.')
else:
await ctx.channel.send(newlist) # send the new list.
и второе
@commands.command( # command to check the skin_input in the list.
name="skin_input",
aliases=["s"]
)
async def skin(self, ctx, skin_input):
skin_list = ['battle queen katarina', 'katarina 02', 'graves 01']
newlist = list() # store target skin
skin_found = ""
for skin_item in skin_list:
if skin_input in skin_item: # if "katarina" in skin_item
newlist.append(skin_item) # add it into list, no need in this case
skin_found = skin_item ", " # the return item (str) you want
if len(newlist) == 0:
await ctx.channel.send(f'your skin_input ({skin_input}) is not available.')
else:
await ctx.channel.send(f'{skin_input} available skins: {skin_found[:-2]}') # send the new list. # the[:-2]is to filter ", "
вы можете отредактировать это по-своему, может быть, без лишних new_list
🙂
Комментарии:
1. Большое вам спасибо за это, это действительно сработало, я постараюсь понять ваш код, чтобы научиться делать это самостоятельно, большое вам спасибо
2. @balas Это приятно для тебя, кстати, добро пожаловать в stack! не забудьте изменить
skin_list
ввод-вывод обратно в файл, я использовал жесткий код для его тестирования.