Попытка поместить переменную как команду - PullRequest
0 голосов
/ 11 апреля 2019

Моя переменная urls находит URL из сообщений.Я хочу, чтобы мой бот отправил yes, если он находит URL-адрес из полученных сообщений.Вот что я пробовал,

def action(msg):
    chat_id = msg['chat']['id']
    command = msg['text']

    urls = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', command)

    if command == urls:
        telegram_bot.sendMessage(chat_id, "yes", parse_mode= 'Markdown')

Но это не работает.Это правильный способ поставить переменные в качестве команды и как это исправить?

1 Ответ

1 голос
/ 11 апреля 2019

Кажется, проблема в том, что вы сравниваете command (строка) с urls (список строк). Если вы хотите, чтобы сообщение отправлялось до тех пор, пока в команде хотя бы один URL-адрес был найден, вы можете изменить его на

def action(msg):
    chat_id = msg['chat']['id']
    command = msg['text']

    urls = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', command)

    if urls:
        telegram_bot.sendMessage(chat_id, "yes", parse_mode= 'Markdown')

Примечание. Если совпадений нет, urls будет пустым списком. Логическое значение пустого списка в Python равно false, поэтому if urls передается, только если urls не является пустым списком (т. Е. Было хотя бы одно совпадение). Это эквивалентно высказыванию if len(urls) != 0:.

Если вместо этого вы хотите, чтобы сообщение отправлялось только в том случае, если весь command является URL-адресом, вы можете сделать

def action(msg):
    chat_id = msg['chat']['id']
    command = msg['text']

    pattern = 'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'

    if re.fullmatch(pattern, command):
        telegram_bot.sendMessage(chat_id, "yes", parse_mode= 'Markdown')
...