我想匹配正则表达式(.*)
、[.*]
、{.*}
和<.*>
。有没有办法组合这些正则表达式?
例如,我想到了这样的事情: ([([{<]).*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 匹配,则开头字符为 [
,依此类推。所以我们简单地使用反向引用(1
、2
等)来找出开始字符是什么,然后匹配相应的结束字符。