是否可以将带有键的字典实现为正则表达式和操作(带参数)作为值?
例如
key = "actionname 1 2", value = "method(1, 2)"
key = "differentaction par1 par2", value = "appropriate_method(par1, par2)"
密钥中的用户类型,我需要使用作为用户输入一部分提供的参数执行匹配方法。
如果我们能够在O(1)
时间内完成查找会很棒,即使它至少不可能,我正在寻找解决方案来解决这个问题。
我将有几百个正则表达式(比如说300
)并匹配参数化的动作来执行。
我可以编写一个循环来实现这一点,但有没有优雅的方法可以在不使用for循环的情况下执行此操作?
相关问题:Hashtable/dictionary/map lookup with regular expressions
答案 0 :(得分:7)
是的,完全有可能:
import re
dict = {}
dict[re.compile('actionname (\d+) (\d+)')] = method
dict[re.compile('differentaction (\w+) (\w+)')] = appropriate_method
def execute_method_for(str):
#Match each regex on the string
matches = (
(regex.match(str), f) for regex, f in dict.iteritems()
)
#Filter out empty matches, and extract groups
matches = (
(match.groups(), f) for match, f in matches if match is not None
)
#Apply all the functions
for args, f in matches:
f(*args)
答案 1 :(得分:4)
当然,你的字典的值可以是python函数。
您的匹配函数可以尝试将字符串与每个键匹配,并在匹配时执行适当的函数。在最好的情况下,这将是线性的,但如果你想使用正则表达式,我认为你不能得到更好的东西。
但是看看你的示例数据,我认为你应该重新考虑是否需要正则表达式。也许您可以将输入字符串解析为,例如<procedure-name> <parameter>+
然后按名称(简单字符串)查找适当的过程,可以是O(1)
答案 2 :(得分:2)
不幸的是,这是不可能的。您需要迭代正则表达式以确定它们是否匹配。字典中的查找虽然是O(1)
(但这并不能解决您的问题)。
答案 3 :(得分:0)
恕我直言,你问错误的问题。
你问是否有一种优雅的方式来做到这一点。答案: 最优雅的方式是最明显的方式。 代码将被修改10倍到20倍。因此,如果你写了一些难以阅读和快速理解的“优雅”,你就会在你不得不以某种方式修改它之后破坏那个人。
更好的代码:
这里的另一个答案是这样的:
matches = ( (regex.match(str), f) for regex, f in dict.iteritems() )
这在功能上是等效的(重要的是,在Python生成的字节码方面相同)到:
# IMHO 'regex' var should probably be named 'pattern' since it's type is <sre.SRE_Pattern>
for pattern, func in dictname.items():
if pattern.match(str):
func()
但是,以下示例非常容易阅读和理解。
如果你是那些被代码冒犯的人之一,我道歉(一点点),甚至比你想象的还要多一些。我的标准,以及PEP-8中提到的Guido,是最清晰的代码是最好的代码。