Как сделать «если» или «иначе» с регулярным выражением?

#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 ввод-вывод обратно в файл, я использовал жесткий код для его тестирования.