parsing nested parentheses in python, grab content by level

后端 未结 3 1891
日久生厌
日久生厌 2020-11-29 07:46

Apparently this problem comes up fairly often, after reading

Regular expression to detect semi-colon terminated C++ for & while loops

and thinking about

3条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-29 08:09

    #!/usr/bin/env python
    import re
    
    def ParseNestedParen(string, level):
        """
        Generate strings contained in nested (), indexing i = level
        """
        if len(re.findall("\(", string)) == len(re.findall("\)", string)):
            LeftRightIndex = [x for x in zip(
            [Left.start()+1 for Left in re.finditer('\(', string)], 
            reversed([Right.start() for Right in re.finditer('\)', string)]))]
    
        elif len(re.findall("\(", string)) > len(re.findall("\)", string)):
            return ParseNestedParen(string + ')', level)
    
        elif len(re.findall("\(", string)) < len(re.findall("\)", string)):
            return ParseNestedParen('(' + string, level)
    
        else:
            return 'fail'
    
        return [string[LeftRightIndex[level][0]:LeftRightIndex[level][1]]]
    

    Tests:

    if __name__ == '__main__':
    
        teststring = "outer(first(second(third)second)first)outer"
    
        print(ParseNestedParen(teststring, 0))
        print(ParseNestedParen(teststring, 1))
        print(ParseNestedParen(teststring, 2))
    
        teststring_2 = "outer(first(second(third)second)"
    
        print(ParseNestedParen(teststring_2, 0))
        print(ParseNestedParen(teststring_2, 1))
        print(ParseNestedParen(teststring_2, 2))
    
        teststring_3 = "second(third)second)first)outer"
    
        print(ParseNestedParen(teststring_3, 0))
        print(ParseNestedParen(teststring_3, 1))
        print(ParseNestedParen(teststring_3, 2))
    

    output:

    Running tool: python3.1
    
    ['first(second(third)second)first']
    ['second(third)second']
    ['third']
    ['first(second(third)second)']
    ['second(third)second']
    ['third']
    ['(second(third)second)first']
    ['second(third)second']
    ['third']
    >>> 
    

提交回复
热议问题