所以在我正在研究的GroupMe Bot中 - 我已经让机器人通过webhooks中的if语句传递消息来响应。
def webhook():
# 'message' is an object that represents a single GroupMe message.
message = request.get_json()
speaker = message['name']
# If hypefact! is spoken, return random fact
# This code replies once and then calls another function that replies again
if 'hypefact!' in message['text'].lower() and not sender_is_bot(message):
reply(speaker + ' - Here is your Hype Fact: ')
reply(fact_delivery())
现在下面是get_weather的函数
def get_weather(city):
## Bunch of stuff happens
reply(weatherData['currently']['summary'] + ', ' + str(
weatherData['currently']['apparentTemperature']) + degree_sign + 'F. ' + weatherData['hourly'][
'summary'] + '\n\n' + weatherData['daily']['summary'])
如果短语是“在消息['text']中”,它将触发一个动作,因为它在消息中。
如果我试图解析此消息该怎么办。
“本周末奥斯汀的天气如何”
该短语的关键部分是“奥斯汀的天气”
所以我想在“in”之后接受这个词并将其解析为get_weather(city)
预期的工作流程: 聊天中的人说消息中带有“{CITY}中的天气”的短语 机器人触发器,过滤字符串中的城市以调用get_weather函数
答案 0 :(得分:1)
你可以使用正则表达式,但那不是那么明显。 您描述的案例很容易被
抓住import re
text = "Whats the weather in Austin this weekend"
match = re.search('[Ww]eather in (?P<city>\w+)', text)
if match:
print(match.groupdict()) # {'city': 'Austin'}
else:
pass # the text does not contain "weather in {CITY}" pattern
但并非所有城市都有一个单词的名称。因此,诀窍是告诉城市名称何时结束并且“句子的其余部分”开始。例如,您可以依赖以大写字母开头的所有单词都是城市名称的一部分
text2 = "Whats the weather in New York this weekend"
match2 = re.search('[Ww]eather in (?P<city>([A-Z]\w+\W+)+)', text2)
if match2:
print(match2.groupdict()) # {'city': 'New York '}
else:
pass # the text does not contain "weather in {CITY}" pattern
但是,因为它是一个聊天机器人,你试图创建,好吧,有多少人在聊天中使用大写字母和标点符号?...
因此,您可能需要在捕获了您认为是城市名称的内容之后,与一些预定义的城市名称列表保持一致(我不应该 我认为)。