Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用正则表达式作为字典中的键,以及如何使用它进行访问?_Python_Regex_Dictionary_Tuples - Fatal编程技术网

Python 如何使用正则表达式作为字典中的键,以及如何使用它进行访问?

Python 如何使用正则表达式作为字典中的键,以及如何使用它进行访问?,python,regex,dictionary,tuples,Python,Regex,Dictionary,Tuples,我有一本以元组为键的字典。元组中有一个数字和正则表达式。元组作为键对应于任意值。我想使用元组(即正则表达式)作为键来访问值。比如说, import re t_dict = dict() t[(1, r"[0-9]+")] = "Hello world!" t[(2, r"[a-z]+")] = "Hi!" 我在上面放一个正则表达式是正确的吗?如果没有,如何在其上放置正则表达式 接下来,我想使用键获取字典中的值。例如,我想这样做 print t[(1, '99')] # this should

我有一本以元组为键的字典。元组中有一个数字和正则表达式。元组作为键对应于任意值。我想使用元组(即正则表达式)作为键来访问值。比如说,

import re

t_dict = dict()
t[(1, r"[0-9]+")] = "Hello world!"
t[(2, r"[a-z]+")] = "Hi!"
我在上面放一个正则表达式是正确的吗?如果没有,如何在其上放置正则表达式

接下来,我想使用键获取字典中的值。例如,我想这样做

print t[(1, '99')] # this should print "Hello world!"
print t[(2, 'hey')] # this should print "Hi!"

要执行所需操作,可以对内置字典进行子类化,然后覆盖它的
\uuuu getitem\uuu
方法以获得所需的查找类型

这种方法的问题是,您将无法重现实际字典的
O(1)
查找,因为Python的内置哈希函数不理解正则表达式(我也不知道有任何哈希函数理解正则表达式)


要进行
O(1)
(常数时间)反向查找以查找与字符串匹配的正则表达式,没有简单的方法。除非您确实尝试过正则表达式,否则无法知道正则表达式是否与字符串匹配。

您的用例没有内置支持。因为dictionary只是一个键值对,所以不存在这种基于模式的支持。而且,这看起来也不是一个像样的数据结构。也许你可以从更高的层次告诉我们你的用例,所以我们可能会建议你一种不同的方法;字典的意义在于它是一个哈希表,所以您可以通过
O(1)
中的键来查找值。你可以编写一个数据结构来满足你的需要,但它必须对正则表达式“key”进行
O(n)
扫描才能找到匹配的值。对不起,我不明白你的意思,先生们。我发现一个代码的工作原理如下:t[(1,'a')]=“Hello World!”,t[(2,'b')]=“Hi!”。因此,检索值“helloworld”只是t[(1,'a')]。我试图使用字典作为DFA转换的列表来模拟DFA。因此,我在这里写的正则表达式意味着“0-infinite中的任意数字”,所有字符串都只有a-z中的字母。在DFA中,可能有不同的正则表达式,但有相同的起始状态。例如,t[(1,r“[0-9]+”)和t[(1,r“[^0-9]+”)的查找时间将非常接近O(1),因为唯一的额外开销是将正则表达式应用于提供的键。无论如何,如果您的答案中包含显示如何重写从其
dict
基类继承的
\uuuu setitem\uuuu()
方法的代码,我会对您的答案投赞成票。@martineau,
“查找时间将非常接近O(1),因为唯一额外的开销是将正则表达式应用于提供的键。”
。不完全是。您必须针对每个正则表达式测试用于查找的输入字符串,因为它们中的任何一个都可以匹配。无法保证输入查找字符串只匹配其中一个正则表达式,即使匹配了,如果不实际检查每个正则表达式,也无法判断。@martineau,
“查找时间将非常接近O(1),因为唯一的额外开销是将正则表达式应用于提供的键。”
。不完全是。您必须针对每个正则表达式测试用于查找的输入字符串,因为它们中的任何一个都可以匹配。无法保证输入查找字符串只匹配一个正则表达式,即使存在,在我看来,从OP问题中的示例可以看出,要使用哪个正则表达式,因为每个键都是一个元组,其第一个值看起来像是检查匹配时要使用哪个正则表达式。