有没有在Python中结合正则表达式匹配和检查无?

时间:2012-10-29 13:12:59

标签: python regex

假设我正在编写一个简单的解析器。它有一个调度程序,它根据输入表达式的类型调用相应的解析函数。

def dispatcher(expression):
    m = pattern1.match(expression):
    if m is not None:
        handle_type1(expression, m)
    # ... other types

我的问题是,无论如何要结合None的匹配和检查?我的意思是,类似于以下C代码:

void dispatcher(char *expression)
{
    if ((m = pattern1.match(expression)) != NULL) {
        // ... handle expression type 1
    }
    else if ((m = pattern2.match(expression)) != NULL) {
        // ... handle expression type 2
    }
    // ... other cases
}

谢谢!

3 个答案:

答案 0 :(得分:5)

这实际上不是关于将模式匹配与检查无关联,而是关于是否可以在一个表达式中分配变量并评估该赋值的结果,因为pattern.match()调用可以是返回a的任何函数值。

答案一般不是,因为in Python assignment is a statement,而不是C中的表达。

在这种情况下,我能看到的唯一区别是你为自己节省了额外的回车,这不是那么有用。赋值和比较惯用法在循环中更有用,但在Python中你只需要两行(如果需要,使用break)。

答案 1 :(得分:3)

难道你没有发现你的C样例有点重复吗?如果您发现一遍又一遍地重复代码,请考虑将其替换为循环。这样的事情可以避免重复匹配和测试:

def dispatcher(expression):
    for pattern, action in [
        (pattern1, handle_type1),
        (pattern2, handle_type2),
        ]:
        m = pattern.match(expression):
        if m is not None:
           action(expression, m)
           break

您还可以通过各种方式将模式和处理程序列表拉出循环,例如,如果处理程序是同一类的所有方法,则可以使用处理程序旁边定义的模式自动定义装饰器以自动构建列表

@patternhandler('some regex')
def handle_type1(expression, match):
    ...

答案 2 :(得分:2)

你能做的最好,并且有一些争论是否更好,就是创建一个班来做这项工作。然后该类可以保持状态,例如最后匹配的模式:

class Matcher(object):
    def __init__(self):
        self.m = None

    def match(self, pattern, text):
        self.m = re.match(pattern, text)
        return self.m


def dispatcher(expression):
    matcher = Matcher()
    if matcher.match(pattern1, expression):
        handle_type1(expression, matcher.m)
    if matcher.match(pattern2, expression):
        handle_type2(expression, matcher.m)