繁体   English   中英

如何在Python中使用带占位符文本的正则表达式?

[英]How do I use regular expressions in Python with placeholder text?

我正在用Python做一个项目,我要求用户输入文本。 如果文本与程序支持的格式匹配,它将输出包含用户关键字的响应(它是一个简单的聊天机器人)。 格式作为用户输入格式和答案格式存储在文本文件中。

例如,文本文件如下所示,左侧是用户输入,右侧是输出:

my name is <-name> | Hi there, <-name>

因此,如果用户写my name is johnny ,我希望程序知道johnny<-name>变量,然后打印响应Hi there, johnny

有些人在正确的方向上刺激我会很棒! 我之前从未使用过正则表达式,我读过一篇关于如何使用它们的文章,但不幸的是它并没有真正帮助我,因为它主要是如何匹配特定的单词。

这是一个例子:

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+ (?P<name>...)存储在我们稍后将要使用的匹配对象中的名称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))

您将要进行组匹配,然后拉出搜索组。

首先你要import re -re是python regex模块。 让我们说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)

要求REGEXP不可避免地会得到像你现在得到的那样的答案:基本REGEXP操作的演示:如何分割句子,搜索某些术语组合,如“我的”+“名称”+“是”等等。

事实上,您可以通过阅读现有文档和开源程序来学习所有这些。 REGEXP并不容易。 如果你想改变和扩展你的程序,你仍然需要了解自己能够真正了解正在发生的事情。 不要只是从这里的收据复制。

但你甚至可能想要更全面的东西。 因为你提到建立一个“聊天机器人”,你可能希望看到其他人如何接近这个任务 - 超越REGEXP。 看到:

因此,如果用户写'我的名字是johnny',我希望程序知道'johnny'是'<--name>'变量,...

从你的问题来看,目前还不清楚,该计划应该变得多么复杂。 什么,如果他打字

'Johnny is my name.'

要么

'Hey, my name is John X., but call me johnny.'

看看re模块并注意捕获组。

例如,您可以假设名称将是一个单词,因此它匹配\\w+ 然后你必须使用\\w+捕获组构建一个正则表达式,其名称应该是(捕获组由括号分隔):

r'my name is (\w+)'

然后将其与输入匹配(提示:在re模块文档中查找match )。

获得匹配后,您必须获取捕获组的内容(在此情况下为索引1,索引0保留用于整个匹配)并使用它来构建响应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM