0

我已经编写了以下代码,并且运行良好。但是其中一种情况失败了。我尝试过但无法解决此问题。

#!/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&S&!SE)

预期的 :

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

4

1 回答 1

2

您检查depth == 0作为从返回的条件extract_next_state()extract_next_state()一旦找到与第一个左括号匹配的右括号,即返回。然后,当然不会检查字符串的其余部分是否有任何进一步的括号。

如果不知道“next_state”的规则或允许的表达式的语法,很难推荐解决方案。但是从最后一行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

如果最后一个右括号所有对都匹配,则丢弃字符串的其余部分,否则将添加匹配数量的右括号。

于 2013-11-15T12:08:31.113 回答