2014-11-05 56 views
0

我有这样一个字符串列表:如何迭代字符串列表并进行模式匹配?

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]) 

如何中断计算,使其计算开合数的缺省数量,并在开头括号获得其右括号时,然后在下一个开口括号后添加元素,以得到结果:['A','B','G']['B', 'C', 'E']

+2

我不明白你的例子。不明显的是,这些机制是什么导致A,B,G在一个组中,而B,C,E在另一个组中。例如,为什么F不通和B出现两次?准确的规则是什么? – 2014-11-05 07:44:32

+0

@John Zwinck我想考虑它:A有2个内部列表(B(CD)(EF))和(GH),所以我想提取A和这两个内部列表的第一个元素。同样,B有两个内部列表(CD)和(EF),所以我想提取B,C,E。 – 2014-11-05 07:47:55

+0

你应该使用堆栈来实现它 – 2014-11-05 08:34:45

回答

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 
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))) 

这当然可以通过印刷分支节点,因为他们完成解析(在')'情况)进行合并操作。