提取两个括号之间的字符串,包括python中的嵌套括号

时间:2019-01-31 07:57:44

标签: python regex

如何在两个括号(包括嵌套的括号)之间提取字符串。

有一个字符串:

""res = sqr(if((a>b)&(a<c),(a+b)*c,(a-b)*c)+if()+if()...)""

如何提取if()的所有内容,如下所示:

["if((a>b)&(a<c),(a+b)*c,(a-b)*c)","if()","if()",...]

格式不是固定的,字符串可能包含多个{if。所以我想知道是否有可以匹配子字符串的模式。稍后我将尝试给出解决方案。谢谢。

我的解决方法,如果有更好的方法,请向我指出:

def extractIfFunc(condStr):

startIndex = [m.start() for m in re.finditer('if\(',condStr)]
parts = []
for index in startIndex:
    current = []
    bracket_level = 0
    for s in condStr[index+3:]:
        if s != '(' and s != ')' and bracket_level >= 0:
            current.append(s)
        elif s == '(':
            current.append(s)
            bracket_level += 1
        elif s == ')':
            bracket_level -= 1 
            if bracket_level < 0:
                current.append(s)
                break
            else:
                current.append(s)     
    parts.append('if('+''.join(current))
return parts  

4 个答案:

答案 0 :(得分:1)

尝试一下:

st[st.find('(')+1:st.rfind(')')]

答案 1 :(得分:1)

>>> import re
>>> s = """res = sqr(if((a>b)&(a<c),(a+b)*c,(a-b)*c)+if()+if()...)"""
>>> re.findall(r'if\((?:[^()]*|\([^()]*\))*\)', s)
['if((a>b)&(a<c),(a+b)*c,(a-b)*c)', 'if()', 'if()']

对于这种模式,最好使用VERBOSE标志:

>>> lvl2 = re.compile('''
...          if\(            #literal if(
...            (?:           #start of non-capturing group
...             [^()]*       #non-parentheses characters
...             |            #OR
...             \([^()]*\)   #non-nested pair of parentheses
...            )*            #end of non-capturing group, 0 or more times
...          \)              #literal )
...          ''', flags=re.X)
>>> re.findall(lvl2, s)
['if((a>b)&(a<c),(a+b)*c,(a-b)*c)', 'if()', 'if()']


要匹配任意数量的嵌套对,可以使用regex模块,请参见Recursive Regular Expressions

答案 2 :(得分:0)

st = """res = sqr(if((a>b)&(a<c),(a+b)*c,(a-b)*c))"""

print(st[10:][:-1])

输出:

if((a>b)&(a<c),(a+b)*c,(a-b)*c)

编辑:

对于通用方法:

import re
st = """res = sqr(if((a>b)&(a<c),(a+b)*c,(a-b)*c))"""
pattern = "\((.*)\)"
print(re.compile(pattern).search(st).group(1))

位置:

\(从字面上匹配字符((区分大小写)

第一捕获组(.*)

.*匹配任何字符(行终止符除外)

\)从字面上匹配字符)

输出:

if((a>b)&(a<c),(a+b)*c,(a-b)*c)

regexTester

答案 3 :(得分:-1)

def extractIfFunc(condStr):
    for i, segment in enumerate(a.split("if")):
        if i == 0:
            continue

        s, n = -1, 0
        for i, c in enumerate(segment):
            if c == '(':
                s = i if s < 0 else s
                n += 1
            elif c == ')':
                n = n - 1 if n > 0 else 0
                if n == 0 and s > -1:
                    yield "if(%s)" % segment[s + 1:i]
                    break


a = """res = sqr(if((a>b)&(a<c),(a+b)*c,(a-b)*c)+if()+if()...)"""

for segment in extractIfFunc(a):
    print(segment)

注意:

这不是真正的解析器。如果要创建与 LALR(1)语法相匹配的解析器,则可能是PLY所要的。它可以帮助您构建完整的解析器。