如何迭代字符串列表并进行模式匹配?

时间:2014-11-05 07:38:02

标签: python

我有一个像这样的字符串列表:

lst= ['(', 'A', '(', 'B', '(', 'C', 'D', ')', '(', 'E', 'F', ')', ')', '(', 'G', 'H', ')', ')']

加入它看起来像这样:

(A(B(CD)(EF))(GH))

我希望按元素遍历列表并将值存储到两个列表中:['A','B','G'] ['B', 'C', 'E']

我试图这样做:

l1=[]
for i in range(len(lst)):
    if lst[i] == '(':
        l1.append(lst[i+1])

如何打破计算,使其计算打开和关闭paranthesis的数量,以及当左括号获得其右括号时,然后在下一个左括号后添加元素,以获得结果:{{1} } ['A','B','G']

2 个答案:

答案 0 :(得分:0)

import re

string = ''.join(lst)
results = []

for match in re.finditer('\w\(', string):
    parens = 0
    substring = string[match.start():]
    results.append([substring[0]])
    for ii, ch in enumerate(substring):
        if ch == '(':
            parens += 1
            if parens == 1:
                results[-1].append(substring[ii+1])
        elif ch == ')':
            parens -= 1
            if parens < 0:
                break

或没有正则表达式:

results = []

for jj in range(len(lst) - 1):
    if lst[jj] != ')' and lst[jj+1] == '(':
        parens = 0
        results.append([lst[jj]])
        substring = lst[jj:]
        for ii, ch in enumerate(substring):
            if ch == '(':
                parens += 1
                if parens == 1:
                    results[-1].append(substring[ii+1])
            elif ch == ')':
                parens -= 1
                if parens < 0:
                    break

答案 1 :(得分:0)

如果我理解正确,字符串表示树结构,每个节点都有一个名称和任意数量的子节点。在s表达式样式中,此名称是列表中的第一个条目(如果有列表;叶节点仅被命名)。

(A
  (B
    (CD)
    (EF))
  (GH))

在此树中,您希望打印出具有多个分支的节点,包括这些分支的名称,但不包括其内容。使用堆栈解析它们确实最简单,可能隐含在递归中。

from pprint import pprint

instr="(A(B(CD)(EF))(GH))"

nodes=[]
curnode=nodes
nodestack=[]
for char in instr:
    if char == '(':
        nodestack.append(curnode)
        curnode.append([])
        curnode=curnode[-1]
    elif char == ')':
        curnode=nodestack.pop()
    else:
        curnode.append(char)

# Show that the tree is now converted into list form
pprint(nodes, width=20)

def name(node):
    return node[0]
def branches(tree):
    if len(tree)>=3:
        yield map(name,tree)    # exploits that names are only 1 char
    for branch in tree[1:]:
        # search deeper also
        for subbranch in branches(branch):
            yield subbranch

for root in nodes:
    pprint(list(branches(root)))

通过在完成解析时打印分支节点,可以合并操作(在')'情况下)。