Найти совпадения по командам в начале текста
У нас есть много разных команд:
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 шт):
Из того, что вижу. У Вас ошибка в обработке команды и строки с не. Вы проверяете команду на вхождение в нее строки запроса. Нужно наоборот. Такой вариант всегда даст 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']
Структура списка команд по мне будет лучше работать, если все сделать в виде словаря, а на ключи словаря дальше функцию обработки уже вешать. Но что есть.