2013-11-15 90 views
0

我寫了下面的代碼,它工作的很好。但是其中一種情況是失敗。我試過但無法解決這個問題。python中的括號匹配代碼

#!/usr/bin/env py 
import itertools 
import sys 
import sympy 
import re 
import pprint 
def extract_next_state(s): 
    p = re.compile('(\()|(\))') 
    depth = 0 
    startindex = None 
    start_point = False 
    for m in p.finditer(s): 
     if m.group(1):   # (
      depth += 1 
      print "depth (", depth 
      if not start_point: 
       startindex = m.start() 
       start_point = True 
     elif m.group(2):   #) 
      depth -= 1 
      print "depth)", depth 
      if depth == 0: 
       return s[startindex:m.end()] 
    return s[startindex:] + ')' * depth 

if __name__ == "__main__": 
    #data = ['next_state=(~SE&((~B2&D)|(B2&lq))|(SE&SI))'] 
    #data = ['next_state=((~SE&((A1&A2)|(B1&B2)))|(SE&SI)))'] 
    #data = ['next_state=((((~SE&((A1&A2)|(B1&B2)))|(SE&SI)))'] 
    data = ['next_state=(D1&S&!SE)|(!S&(!SE&D0))|(SE&SI))'] 
    data_1 = data[0].split(',') 
    com = None 
    for item in data_1: 
     if item.find('next_state=')!= -1: 
      item_list = item.split('=') 
      item_op = extract_next_state(item_list[1]) 
      print item_op 

輸出:

(D1 &小號& SE!)

預計:

(D1 &小號& SE!)|(S &! (!SE & D0))|(SE & SI)

+2

正則表達式不能用於嵌套結構,例如圓括號內的圓括號。 –

+0

@JoachimPileborg,這取決於正則表達式的味道。在PCRE中,它很簡單:'(?:[^()] | \((?R)\))*'。 – Qtax

+0

@Qtax我不知道我是否會稱此*簡單*。 :) –

回答

2

你爲depth == 0作爲條件檢查來自extract_next_state()返回。這是extract_next_state()返回匹配右括號到第一個左括號發現。然後,字符串的其餘部分當然不會被檢查任何進一步的括號。

如果不知道「next_state」或allowd表達式的語法規則,很難推薦解決方案。但是從最後一行extract_next_state看來您希望關閉任何左括號。因此,一個可能的解決方案是:

def extract_next_state(s): 
    p = re.compile('(\()|(\))') 
    depth = 0 
    startindex = None 
    endindex = None 
    for m in p.finditer(s): 
     if m.group(1):   # (
      depth += 1 
      print "depth (", depth 
      if not startindex: 
       startindex = m.start() 
     elif m.group(2):   #) 
      depth -= 1 
      print "depth)", depth 
      if depth == 0: 
       endindex = m.end() 
    return s[startindex:(endindex if depth == 0 else None)] + ')' * depth 

如果與上次右括號所有成對匹配,字符串的其餘部分被丟棄,會添加其他右括號的匹配數量。

+0

有些時候,人們會像我一樣使事情變得複雜。接受你的回答 – user765443