如何使用 RegEx 执行 if 或 else?

Posted

技术标签:

【中文标题】如何使用 RegEx 执行 if 或 else?【英文标题】:How to do an if or else with RegEx? 【发布时间】:2021-09-30 08:27:38 【问题描述】:

我仍在学习 Python,并且正在为我的 Discord 服务器开发一个机器人。我想做一个命令来检查我的列表(cat.json)中皮肤(项目)的可用性。

所以一位朋友推荐我使用 RegEx 来识别该项目,并且它可以正常工作。

我想对这个系统应用规则(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 katarina

'your skin (katarina) is not available.'

预期:

命令:!s katarina

['battle queen katarina', 'katarina 02']

如果它返回这样就完美了:

'Katarina available skins: Battle Queen Katarina, Katarina 02'

【问题讨论】:

Regex 不是解决此问题的合适解决方案。 Python 有 in 关键字,您可以使用它来检查关键字是否出现在给定名称中。 我会在那个正则表达式模式上做更多工作......你可以使用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 :)

【讨论】:

非常感谢,它真的很有效,我会尝试理解你的代码来学习如何自己做非常感谢你 @balas 这对你很好,欢迎加入 btw!记得把skin_list改回文件I/O,我用硬代码测试过。

以上是关于如何使用 RegEx 执行 if 或 else?的主要内容,如果未能解决你的问题,请参考以下文章

if else条件在Regex c#中并返回常量值

创建视图时如何执行 IF/ELSE 检查

如何阻止 if/else 中的 else 被执行?

如何在多个if / else条件下使用Throws?

如何在一行中执行if和else

如何使用 ngClass 执行 if-else?