在parantheses之间的数据中提取字符串忽略内部的parantheses regex python

时间:2017-08-04 16:12:54

标签: python regex

示例输入

 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:我想使用拆分方法很容易,但出于好奇,如何使用正则表达式来完成?

6 个答案:

答案 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]