Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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 - Fatal编程技术网

在Python中是否有将正则表达式匹配和无检查相结合的方法?

在Python中是否有将正则表达式匹配和无检查相结合的方法?,python,regex,Python,Regex,假设我正在编写一个简单的解析器。它有一个dispatcher,它根据输入表达式的类型调用相应的解析函数 def dispatcher(expression): m = pattern1.match(expression): if m is not None: handle_type1(expression, m) # ... other types 我的问题是,是否存在将匹配和检查None结合起来的方法?我的意思是,类似于下面的C代码: void dis

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

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
}

谢谢

这并不是将模式匹配与无检查相结合,而是关于是否可以在一个表达式中为变量赋值并计算赋值结果,因为pattern.match()调用可以是任何返回值的函数

答案通常是否定的,因为它不是C中的表达式


在这种情况下,我能看到的唯一区别是,你为自己节省了一个额外的回车时间,这不是很有用。赋值和比较习惯用法在循环中更有用,但在Python中,您只需在两行上完成它(必要时使用break)。

您所能做的最好的事情是创建一个类来完成这项工作,这是否更好还有争议。然后该类可以保持状态,例如最后匹配的模式:

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)

你不觉得你的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):
    ...

不,不是真的。你为什么要这样做?只是看得好一点,我还试着将已编译的正则表达式模式放入一个元组中,然后检查它以避免编写if-else。嗯,看看
re.findall
,然后我问了一会儿。答案不是不玩一些肮脏的把戏