1

我有一个这样的字符串:'aaa(cc(kkk)c)ddd[lll]{m(aa)mm}'. 从该字符串中,我想获得以下结构:['aaa', '(cc(kkk)c)', 'ddd', '[lll]', '{m(aa)mm}']. 换句话说,我想分隔不同类型括号中的子字符串。

4

3 回答 3

7

您需要使用堆栈方法来跟踪嵌套级别:

pairs = {'{': '}', '[': ']', '(': ')'}

def parse_groups(string):
    stack = []
    last = 0
    for i, c in enumerate(string):
        if c in pairs:
            # push onto the stack when we find an opener
            if not stack and last < i:
                # yield anything *not* grouped
                yield string[last:i]
            stack.append((c, i))
        elif c in pairs:
            if stack and pairs[stack[-1][0]] == c:
                # Found a closing bracket, pop the stack
                start = stack.pop()[1]
                if not stack:
                    # Group fully closed, yield
                    yield string[start:i + 1]
                    last = i + 1
            else:
                raise ValueError('Missing opening parethesis')

    if stack:
        raise ValueError('Missing closing parethesis')

    if last < len(string):
        # yield the tail
        yield string[last:]

这将生成组,如果需要,将其转换为列表:

>>> list(parse_groups('aaa(cc(kkk)c)ddd[lll]{m(aa)mm}'))
['aaa', '(cc(kkk)c)', 'ddd', '[lll]', '{m(aa)mm}']

如果括号/括号不平衡,则会引发异常:

>>> list(parse_groups('aa(bb'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 19, in parse_groups
ValueError: Missing closing parethesis
>>> list(parse_groups('aa[{bb}}'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 20, in parse_groups
ValueError: Missing opening parethesis
>>> list(parse_groups('aa)bb'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 20, in parse_groups
ValueError: Missing opening parethesis
于 2013-03-07T10:49:07.887 回答
1

你也可以看看pyparsing。有趣的是,这可以实现为堆栈,您可以在找到 {[( 并在找到 )]} 时推送字符串片段。

于 2013-03-07T10:51:06.730 回答
0

我认为您可以尝试自定义字符串解析器库(我是它的作者)。它旨在处理具有任何逻辑结构的数据,因此您可以按照自己的方式对其进行自定义;)

于 2013-03-07T10:44:55.820 回答