2013-11-15 68 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