我正在用Python做一个项目,我要求用户输入文本。如果文本与程序支持的格式匹配,它将输出包含用户关键字的响应(它是一个简单的聊天机器人)。格式作为用户输入格式和答案格式存储在文本文件中。
例如,文本文件如下所示,左侧是用户输入,右侧是输出:
my name is <-name> | Hi there, <-name>
因此,如果用户写my name is johnny
,我希望程序知道johnny
是<-name>
变量,然后打印回复Hi there, johnny
。
有些人在正确的方向上刺激我会很棒!我之前从未使用过正则表达式,我读过一篇关于如何使用它们的文章,但不幸的是它并没有真正帮助我,因为它主要是如何匹配特定的单词。
答案 0 :(得分:8)
以下是一个例子:
import re
io = [
('my name is (?P<name>\w+)', 'Hi there, {name}'),
]
string = input('> ')
for regex, output in io:
match = re.match(regex, string)
if match:
print(output.format(**match.groupdict()))
break
我会带你通过它:
'my name is (?P<name>\w+)'
(?P<name>...)
将以下部分(\w+
)存储在我们稍后将要使用的匹配对象中的名称name
下。
match = re.match(regex, string)
这会在给定的输入中查找regex
。请注意,re.match
仅在输入的开头处匹配,如果您不希望此限制在此处使用re.search
。
如果匹配:
output.format(**match.groupdict())
match.groupdict
返回由(?P<name>...)
定义的密钥字典及其关联的匹配值。 **
将这些键/值传递给.format
,在这种情况下,Python会将其转换为output.format(name='matchedname')
。
要从文件构造io
字典,请执行以下操作:
io = []
with open('input.txt') as file_:
for line in file:
key, value = line.rsplit(' | ', 1)
io.append(tuple(key, value))
答案 1 :(得分:4)
您将要进行群组匹配,然后撤出搜索群组。
首先你想要import re
- re是python正则表达式模块。
让我们说user_input是保存输入字符串的var。
然后,您希望使用re.sub方法匹配您的字符串并返回替换它的内容。
output = re.sub(input_regex, output_regex, user_input)
所以正则表达式,首先你可以把你想要的绝对东西:
input_regex = 'my name is '
如果您希望它从行的开头明确匹配,您应该使用插入符号继续它:
input_regex = '^my name is '
然后你想要一个组匹配任何字符串。+(。是任何东西,+是前面项目的1或更多),直到'$'行结束。
input_regex = '^my name is .+$'
现在你想把它放到命名组中。命名组采用“(?Pregex)”形式 - 请注意,这些尖括号是字面的。
input_regex = '^my name is (?P<name>.+)$'
现在你有一个匹配的正则表达式,并给出一个名为“name”的匹配组,其中包含用户名。输出字符串需要使用“\ g”
引用匹配组 output_regex = 'Hi there, \g<name>'
将它们放在一起你可以在一个衬里(和导入)中进行:
import re
output = re.sub('^my name is (?P<name>.+)$', 'Hi there, \g<name>', user_input)
答案 2 :(得分:1)
要求REGEXP不可避免地导致你现在得到的答案:基本REGEXP操作的演示:如何分割句子,搜索一些术语组合,如'my'+'name'+'is',等
事实上,您可以通过阅读现有文档和开源程序来学习所有这些。 REGEXP并不容易。如果你想改变和扩展你的程序,你仍然需要了解自己能够真正了解正在发生的事情。不要只是从这里的收据复制。
但你甚至可能想要更全面的东西。因为你提到建立一个“聊天机器人”,你可能希望看到how others are approaching that task - 超越REGEXP的方式。参见:
因此,如果用户写'我的名字是johnny',我希望程序知道'johnny'是'&lt; -name&gt;'变量,......
从你的问题来看,目前还不清楚,该计划应该变得多么复杂。什么,如果他输入
'Johnny is my name.'
或
'Hey, my name is John X., but call me johnny.'
答案 3 :(得分:0)
查看re模块并注意捕捉群组。
例如,您可以假设该名称将是一个单词,因此它与\w+
匹配。然后你必须构建一个带有\w+
捕获组的正则表达式,其名称应该是(捕获组由括号分隔):
r'my name is (\w+)'
然后将其与输入匹配(提示:在match
模块文档中查找re
)。
获得匹配后,您必须获取捕获组的内容(在本例中为索引1,索引0保留用于整个匹配)并使用它来构建您的响应。