找出正则表达式满足句子的位置

时间:2018-10-26 06:59:52

标签: python regex parsing

我有一些句子和一个正则表达式。是否有可能找出正则表达式中我的句子满足的位置。例如,将我的句子视为MMMV,将正则表达式视为M+V?T*Z+。现在,正则表达式直到M+V?满足句子为止,而正则表达式的其余部分是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:]

是否有更好的方法可以通过使用一些解析库等实现。

2 个答案:

答案 0 :(得分:1)

假设您的正则表达式非常简单,没有组,反向引用,前瞻等,例如就像您的情况一样,按照模式\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个部分,每个部分仅匹配一个字符,则对于反复切片字符串。

此外,如果两个连续部分的字符大致相同,例如a?a+b应该等于a+b)将不匹配ab,但仅匹配aab,因为单个a已经“由a?消费。

您可以通过编写自己的非常简单的正则表达式匹配器来简化这种正则表达式,从而将复杂度降低到O(n),但在一般情况下可能不值得,甚至更慢。

答案 1 :(得分:0)

您可以使用()将组括在正则表达式中。例如:M+V?(T*Z+),所需的输出存储在正则表达式的第一组中。

我知道问题是python,但是在这里您可以看到正则表达式的作用:

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

console.log(m[1]);