![](/img/trans.png)
[英]How do I search for text in a page using regular expressions in 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.