样本输入
a = '(abc) * (j+2) * (abs(k)) * (log(sum(l)))'
样本输出
['abc','j+2','abs(k)','log(sum(l))']
我试过用这个
g = re.findall(r'\((.+?)\)',a)
我得到的输出
['abc', 'j+2', 'abs(k', 'log(sum(l']
我不知道如何让它跳过所有嵌套的括号
编辑 1:我想使用 split 方法很容易,但出于好奇如何使用正则表达式来完成?
如果您可以假设只有在第一级括号之后才会有空格,那么这将起作用:
\((.+?)\)(?= )
这个正则表达式的作用是除非匹配后有一个空格,否则它不接受它。
另一种可能性是,如果您假设内括号后面总是有另一个右括号。在这种情况下,以下将起作用:
\((.+?)\)(?!\))
这样做的目的是确保比赛结束后没有右括号。
但是,这两种方法都做出了一些可能不正确的假设。如果是这种情况,那么用普通的正则表达式是不可能做到的。
参考这个问题:可以使用正则表达式匹配嵌套模式吗?
不可能的原因是正则表达式基于有限状态自动机。它们是有限的,它们唯一的“记忆”就是它们所处的状态。这意味着要计算嵌套括号的数量,您需要足够的状态来存储嵌套括号的数量。如果没有限制,您可以有一个无限的数字,这与基本概念背道而驰。
然而,一些正则表达式实现已经开始包含递归表达式,这将解决这个问题,例如 PCRE,PHP 的正则表达式引擎。见http://php.net/manual/en/regexp.reference.recursive.php
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句