示例输入
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']
我无法弄清楚如何让它跳过所有嵌套的parantheses
编辑1:我想使用拆分方法很容易,但出于好奇,如何使用正则表达式来完成?
答案 0 :(得分:2)
如果您可以假设只有在第一级括号之后才会有空格,那么这将有效:
\((.+?)\)(?= )
这个正则表达式的作用是除非比赛后有空格,否则不接受它。
另一种可能性是,如果你假设内括号在它们之后总是会有另一个右括号。在这种情况下,以下内容将起作用:
\((.+?)\)(?!\))
这样做可以确保比赛结束后不会立即关闭括号。
然而,这两种方法都做出了一些可能不正确的假设。如果是这种情况,那么用正常的正则表达式就不可能做到这一点 请参阅此问题:Can regular expressions be used to match nested patterns?
不可能的原因是正则表达式基于有限状态自动机。它们是有限的,它们所拥有的唯一“记忆”是它们所处的状态。这意味着要计算嵌套括号,你需要足够的状态才能存储嵌套括号的数量。如果没有限制,你可能会有一个无限的数字,这违背了基本概念。
然而,一些正则表达式实现已经开始包含递归表达式,这将解决这个问题,例如PCRE,PHP的正则表达式引擎。见http://php.net/manual/en/regexp.reference.recursive.php答案 1 :(得分:0)
对于这种情况,您可以使用:
a = '(abc) * (j+2) * (abs(k)) * (log(sum(l)))'
print([c[1:-1] for c in a.split(' * ')])
# ['abc', 'j+2', 'abs(k)', 'log(sum(l))']
答案 2 :(得分:0)
In[60]: a = '(abc) * (j+2) * (abs(k)) * (log(sum(l)))'
a[1:-1].split(') * (')
Out[60]: ['abc', 'j+2', 'abs(k)', 'log(sum(l))']
你可以试试这个
答案 3 :(得分:0)
试试这个:
a = '(abc) * (j+2) * (abs(k)) * (log(sum(l)))'
regex = re.compile(r'\)\s*[*|+|/|-]\s*\(')
b = regex.split(a[1:-1])
print b
Out: ['abc', 'j+2', 'abs(k)', 'log(sum(l))']
这里的好处是,如果你愿意,你可以添加其他操作符(+, - ,*,/)。
注意:只有当您没有将这些运算符嵌套在括号中时,这才有效。 (例如((a + b)* c)将失败)
答案 4 :(得分:0)
第2组似乎有效:
(^|.*?[^\(])\((.*?)\)([^\)].*|$)
答案 5 :(得分:0)
使用环顾四周
这样的东西set()
输出:
a = '(abc) * (j+2) * (abs(k)) * (log(sum(l)))'
list( zip(*re.findall(r'\((.+?)\)(?=( |$))',a)) )[0]