2014-11-05 55 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))) 

這當然可以通過印刷分支節點,因爲他們完成解析(在')'情況)進行合併操作。