2013-11-14 2 views
0

У меня есть строка следующим образом. Мне нужно извлечь строку из следующего состояния и добавить совпадающие скобки . У нас есть функция в Python, которые могут сделать скобку соответствия в PythonСопряжение в скобках в Python

a) data = [next_state=((!SE&((A1&A2)|(B1&B2)))|(SE&SI))):Q=iq] 

b) data = [(next_state=(!SE&((!B2&D)|(B2&lq))|(SE&SI)),clear=B2&lqn,preset=B2&lq)))] 

data_1 = data[0].split(',') 
for item in data_1: 
    if item.find('next_state=')!= -1: 
     item_list = item.split('=') 
     item_op = item_list[len(item_list) -1].lstrip('(').rstrip(')') 
     item_op = "(" + item_op + ")" 
     print item_op 

Excepted:((!SE&((A1&A2)|(B1&B2)))|(SE&SI)) (Удалить Extra и соответствия шаблону)

если требуется правильно/добавить недостающую parenthisis

код был работая нормально, когда у меня нет дополнительной скобки. Но иногда она может добавить дополнительные круглые скобки, например, b case. Так что это не обобщенное решение. возможно ли совместить скобки.


Я редактирую вопрос на основе обратной связи, которую я получил из-под ответа. Окончательная версия кода. Спасибо за предоставление ввода. Код комментарии приветствуются

#!/usr/bin/env py 
import itertools 
import sys 
import sympy 
import re 
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()] 

if __name__ == "__main__": 
    #data = ['next_state=(~SE&((~B2&D)|(B2&lq))|(SE&SI))'] 
    data = ['next_state=((~SE&((A1&A2)|(B1&B2)))|(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 
      expr = sympy.sympify(item_op) 
      temp_list = [ str(data) for data in expr.free_symbols] 
      print temp_list 
+3

Вы поставили код не имеет регулярных выражений на всех, и '' Ā' и b' строки не действительны Python , Пожалуйста, уточните и исправьте свой вопрос. Кроме того, ваше желание не ясно, пожалуйста, укажите пример ввода/ожидаемого вывода и любые исключения/stacktrace/messages/errors, которые вы можете получить. –

+0

Вы забыли котировки для ваших данных образца? что ожидается для вашей функции? – alko

+0

Согласование вложенных структур с регулярными выражениями, особенно * вложенными * структурами, всегда * болезненным *. Возможно, вместо этого вы хотите найти себе парсер. –

ответ

1
import re 

def extract_next_state(s): 
    p = re.compile('(next_state=)|(\()|(\))') 
    depth = 0 
    startindex = None 
    for m in p.finditer(s): 
     if m.group(1):   # next_state= 
      startindex = m.end() 
     elif startindex is None: # haven't found 'next_state=' yet 
      continue 
     elif m.group(2):   # (
      depth += 1 
     elif m.group(3):   #) 
      depth -= 1 
      if depth == 0: 
       return s[startindex:m.end()] 
      elif depth < 0: 
       return s[startindex:m.start()] 
    if startindex is None: return None 
    return s[startindex:] + ')' * depth 

a = '[(next_state=(!SE&((!B2&D)|(B2&lq))|(SE&SI' 
print(extract_next_state(a)) 
b = '[(next_state=(!SE&((!B2&D)|(B2&lq))|(SE&SI)),clear=B2&lqn,preset=B2&lq)))]' 
print(extract_next_state(b)) 

Выход:

(!SE&((!B2&D)|(B2&lq))|(SE&SI)) 
(!SE&((!B2&D)|(B2&lq))|(SE&SI)) 
+0

что среднее из (\() | (\). Не могло понять – user765443

+0

'()' захватывает значение в группе. '\ (' И '\)' соответствует буквенной скобке. –

+0

поэтому, если глубина равна 0, у меня есть все сопоставленные скобки.Если мы не хорошо, чем Как я могу добавить.Я делал раскол с euqal, как. data.split ('='). Поэтому я получал (! SE & ((! B2 & D) | (B2 & lq)) | (SE & SI) и отсутствующий последний – user765443

 Смежные вопросы

  • Нет связанных вопросов^_^