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