字典和输入:如何在值中使用用户输入

Dictionary and Input: How to use the user input in the value

我正在研究一种聊天机器人。我想知道是否有办法在字典中将 input 用作 value。例如:当输入是“我的名字是x”时我想得到答案“你好x”。 我试过这个: "my name is (.*)": ["Hello ! % 1"] 但效果不佳。我想,我需要定义 (.*) 和 %1,但我不知道该怎么做。

如果你知道怎么做,请帮助我。谢谢。

words = {"good night": ["nighty night", "good night", "sleep well"],
         "good morning": ["good morning", "wakey-wakey!", "rise and shine!"],
         "hi": ["hello", "hey", "hi"],
         "how are you": ["I am good, thank you", "Pretty good,thank you", "Very well, thanks",
                         "I am doing great thanks", "Better than some, not as good as others",
                         "I am better now, it is good to talk to you"],
         "bye": ["see you later", "bye", "bye-bye", "see you soon", "bye for now", "catch you later"],
         "my name is (.*)": ["Hello ! % 1"]
         }

text_punk = input("text something: ")

greet_words = words.keys() #check if the key words is in input_text.
word_available = [word for word in greet_words if word in text_punk]

if word_available: # if words are available take the first of key.
    punk = random.choice(words[word_available[0]])
    print(punk)
    talk(punk) #this is for pyttsx3
else:
    print("problem!")

看起来你想要这样的东西:

from random import choice
from re import match, sub

text_punk = ''

while 'bye' not in text_punk:
    words = {"good night": ["nighty night", "good night", "sleep well"],
             "good morning": ["good morning", "wakey-wakey!", "rise and shine!"],
             "hi": ["hello", "hey", "hi"],
             "how are you": ["I am good, thank you", "Pretty good,thank you", "Very well, thanks",
                             "I am doing great thanks", "Better than some, not as good as others",
                             "I am better now, it is good to talk to you"],
             "bye": ["see you later", "bye", "bye-bye", "see you soon", "bye for now", "catch you later"],
             "my name is (.*)": ["Hello ! {1}"]
             }

    text_punk = input("text something: ").lower()

    response = 'I did not get that, sorry'

    for expression in words:
        if m := match(expression, text_punk):
            response = choice(words[expression]).format(*(m.group(i) for i in range(len(m.groups())+1)))
            break

    print(response)

运行 它有一些输入:

text something: hi
hello
text something: my name is grismar
Hello ! grismar
text something: bye!
catch you later

当然,这就是神奇的地方:

choice(words[expression]).format(*(m.group(i) for i in range(len(m.groups())+1)))

如果 expression 匹配 text_punk 中的输入,它会从该词典值中选择一个随机短语。然后它会尝试使用匹配组格式化所选值(替换 {} 中的值)。

它通过列出所有组来做到这一点,从 0 到有许多使用 range(len(m.groups())+1)

例如,如果输入是 'my name is grismar',组 0 将是 'my name is grismar',组 1 将是 grismar。所以命令归结为:

choice(words['my name is (.*)']).format('my name is grismar', 'grismar')

而且由于 choice(words['my name is (.*)']) 只能是 'Hello ! {1}',所以真的是:

'Hello ! {1}'.format('my name is grismar', 'grismar')

它也适用于多个问候语:

"my name is (.*)": ["Hello {1}!", "Hey {1}, long time no see!"]

你可以有多个匹配项:

"my name is ([^\s]+) (.*)": ["Hello {1}!", "Greetings, {2}!", "Mx {2}, first name {1}, OK"]

示例:

text something: my name is jaap van der velde
Hello jaap!
text something: my name is jaap van der velde
Greetings, van der velde!
text something: my name is jaap van der velde
Mx van der velde, first name jaap, OK
text something: