找出正则表达式满足senten的地方

2024-04-26 10:42:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些句子和一个正则表达式。有没有可能知道我的句子在正则表达式中的什么地方满足了呢。例如,我的句子是MMMV,regex是M+V?T*Z+。现在regex直到M+V?满足句子,regex的剩余部分是T*Z+,这应该是我的输出。你知道吗

我现在的方法是将正则表达式分解为各个部分,并将其存储在一个列表中,然后通过连接前n个部分进行匹配,直到句子匹配为止。例如,如果我的正则表达式是M+V?T*Z+,那么我的列表就是['M+', 'V?', 'T*', 'Z+']。然后我在循环中首先用M+匹配字符串,然后用M+V?匹配字符串,依此类推,直到找到完全匹配的字符串,然后将剩余的列表作为输出。下面是代码

            re_exp = ['M+', 'V?', 'T*', 'Z+']
            for n in range(len(re_exp)):
                re_expression = ''.join(re_exp[:n+1])
                if re.match(r'{0}$'.format(re_expression), sentence_language):
                    return re_exp[n+1:]

有没有更好的方法来实现这一点,可以通过使用一些解析库等


Tags: 方法字符串代码inre列表forlen
2条回答

假设您的正则表达式相当简单,没有组、反向引用、lookaheads等,例如,在您的示例中,遵循\w[+*?]?模式,您可以首先将它拆分为多个部分,就像您已经做的那样。但是,您可以通过切掉已经匹配的部分来单独测试每个部分,而不是迭代地连接各个部分并将它们与整个字符串进行匹配。你知道吗

def match(pattern, string):
    res = pat = ""
    for p in re.findall(r"\w[+*?]?", pattern):
        m = re.match(p, string)
        if m:
            g = m.group()
            string = string[len(g):]
            res, pat = res + g, pat + p
        else:
            break
    return pat, res

示例:

>>> for s in "MMMV", "MMVVTTZ", "MTTZZZ", "MVZZZ", "MVTZX":
>>>     print(*match("M+V?T*Z+", s))
...
M+V?T* MMMV
M+V?T* MMV
M+V?T*Z+ MTTZZZ
M+V?T*Z+ MVZZZ
M+V?T*Z+ MVTZ

但是,请注意,在最坏的情况下,如果有一个长度为n的字符串和一个由n部分组成的模式,每个部分只匹配一个字符,则仍然有O(n²)用于重复分割字符串。你知道吗

此外,如果两个连续的部分大约是同一个字符,例如a?a+b(它应该相当于a+b)将不匹配ab,而只匹配aab,因为单个a已经被a?消耗。你知道吗

通过为非常简化的regex类型编写自己的非常简单的regex匹配器,您可以将复杂性降低到O(n),但在一般情况下,这可能不值得,甚至更慢。你知道吗

可以使用()将组括在regex中。例如:M+V?(T*Z+),您想要的输出存储在正则表达式的第一个组中。你知道吗

我知道问题是python,但在这里您可以看到regex的作用:

const regex = /M+V?(T*Z+)/; const str = `MMMVTZ`; let m = regex.exec(str); console.log(m[1]);

相关问题 更多 >