我寫了下面的代碼,它工作的很好。但是其中一種情況是失敗。我試過但無法解決這個問題。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)
正則表達式不能用於嵌套結構,例如圓括號內的圓括號。 –
@JoachimPileborg,這取決於正則表達式的味道。在PCRE中,它很簡單:'(?:[^()] | \((?R)\))*'。 – Qtax
@Qtax我不知道我是否會稱此*簡單*。 :) –