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

时间:2012-02-04 13:02:33

标签: python regex

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

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

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

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

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

4 个答案:

答案 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保留用于整个匹配)并使用它来构建您的响应。