映射正则表达式组匹配项



我想匹配正则表达式(.*)[.*]{.*}<.*>。有没有办法组合这些正则表达式?

例如,我想到了这样的事情: ([([{<]).*1,但这当然符合(.*([.*[{.*{<.*<

我的目标是能够匹配以前的正则表达式组,但在匹配之前将函数应用于该组。

考虑:

def match_pairs(pairs):
    re = '|'.join("({begin}.*{end})".format(begin=beg, end=end) for (beg, end) in pairs)
    return re

我现在正在考虑使用类似于上述函数的东西,但理想情况下,这个函数不会返回很长的正则表达式。如果您认为这个问题没有任何实际价值,请告诉我。我仍然很好奇 Python3 是否支持这样的任何功能,有点像re.sub可以像函数作为替代品。如果不存在这样的功能,我该如何编写match_pairs以便它可以将["()", "[]", "[]", "{}"]作为参数?

此任务的明显(也是最短)正则表达式是(.*)|[.*]|{.*}|<.*>

缺点是你有四个.*子模式的副本,所以如果你需要更改它,你必须在 4 个地方更改它。幸运的是,我们可以通过使用捕获组来解决此问题:

(?:(()|[()|{()|<()).*(?:1)|2]|3}|4>)

在线演示。

这可能看起来令人困惑,但实际上非常简单。该模式是这样构建的:

(?:opening_char_1()|opening_char_2()|...).*(?:1closing_char_1|2closing_char_2|...)

这使用了一个相当简单的小技巧:每个开头字符(([{<)都伴随着一个捕获组,如下所示:[()。这使我们能够"记住"匹配的开始字符 - 如果捕获组 1 匹配,我们知道开头字符是( 。如果捕获组 2 匹配,则开头字符为 [ ,依此类推。所以我们简单地使用反向引用(12等)来找出开始字符是什么,然后匹配相应的结束字符。

相关内容

  • 没有找到相关文章

最新更新