python中的正则表达式字典

时间:2012-06-07 11:36:29

标签: python regex performance mapping

是否可以将带有键的字典实现为正则表达式和操作(带参数)作为值?

例如

  1. key = "actionname 1 2", value = "method(1, 2)"
  2. key = "differentaction par1 par2", value = "appropriate_method(par1, par2)"
  3. 密钥中的用户类型,我需要使用作为用户输入一部分提供的参数执行匹配方法。

    如果我们能够在O(1)时间内完成查找会很棒,即使它至少不可能,我正在寻找解决方案来解决这个问题。

    我将有几百个正则表达式(比如说300)并匹配参数化的动作来执行。

    我可以编写一个循环来实现这一点,但有没有优雅的方法可以在不使用for循环的情况下执行此操作?

    相关问题:Hashtable/dictionary/map lookup with regular expressions

4 个答案:

答案 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)

恕我直言,你问错误的问题

  1. 你问是否有一种优雅的方式来做到这一点。答案: 最优雅的方式是最明显的方式。 代码将被修改10倍到20倍。因此,如果你写了一些难以阅读和快速理解的“优雅”,你就会在你不得不以某种方式修改它之后破坏那个人。

  2. 更好的代码:

  3. 这里的另一个答案是这样的:

    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,是最清晰的代码是最好的代码。