Найти совпадения по командам в начале текста

У нас есть много разных команд:

commands = [{
        'icon': '',
        'command': 'поцеловать',
        'text': 'поцеловал(а)'
    },
    {
        'icon': '',
        'command': 'обнять',
        'text': 'обнял(а)'
    },
    {
        'icon': '',
        'command': 'засосать',
        'text': 'засосал(а)'
    },
    {
        'icon': '?',
        'command': 'ударить',
        'text': 'ударила(а)'
    },
    {
        'icon': '',
        'command': 'поцеловать тебя',
        'text': 'жёстко поцеловала'
    },
    {
        'icon': '',
        'command': 'откос',
        'text': 'откосил(а) у' 
    },
    {
        'icon': '',
        'command': 'крем',
        'text': 'откремил(а) у'
    }]

И возможность вызова с разными аргументами в конце

cmd_string = "иди сюда ты 1"
cmd_string = "иди сюда ты https://site.ru/userid1"

и тд.

Как можно проверить есть ли в начале текста совпадение с определённой командой и если есть разделять их с конечным аргументом, на выходе требуется получить:

({"command": "иди сюда ты"}, "1")

и тд..

Но при этом конечного аргумента может и не быть в таком случае возвращать просто команду

({"command": "иди сюда ты"})

Моя попытка была довольно крива и не логична:

module = list(filter(lambda modules: modules['command'].startswith(cmd_string), commands))

Ответы (1 шт):

Автор решения: Andy Pavlov

Из того, что вижу. У Вас ошибка в обработке команды и строки с не. Вы проверяете команду на вхождение в нее строки запроса. Нужно наоборот. Такой вариант всегда даст False.

cmd_strings = ["поцеловать тебя https://site.ru/userid1", "обнять https://site.ru/userid1", 'обнять', 'обнять https://site.ru/userid1 https://site.ru/userid1',]

commands_list = sorted([c['command'] for c in commands], reverse=True)
cmd_commands = [next(filter(lambda c: c in cmd, commands_list)) for cmd in cmd_strings]
module = [[{'command': c}, cmd.partition(c)[-1].strip()] for c, cmd in zip(cmd_commands, cmd_strings)]

print(*module, sep='\n')

Принт:

[{'command': 'поцеловать тебя'}, 'https://site.ru/userid1']
[{'command': 'обнять'}, 'https://site.ru/userid1']
[{'command': 'обнять'}, '']
[{'command': 'обнять'}, 'https://site.ru/userid1 https://site.ru/userid1']

Структура списка команд по мне будет лучше работать, если все сделать в виде словаря, а на ключи словаря дальше функцию обработки уже вешать. Но что есть.

→ Ссылка