Как уже упоминалось, регулярные выражения не подходят для вложенных конструкций. Я приведу базовый пример, используя pyparsing :
import pyparsing # make sure you have this installed
thecontent = pyparsing.Word(pyparsing.alphanums) | '+' | '-'
parens = pyparsing.nestedExpr( '(', ')', content=thecontent)
Вот пример использования:
>>> parens.parseString("((a + b) + c)")
Выход:
( # all of str
[
( # ((a + b) + c)
[
( # (a + b)
['a', '+', 'b'], {}
), # (a + b) [closed]
'+',
'c'
], {}
) # ((a + b) + c) [closed]
], {}
) # all of str [closed]
(С обновлением / отступом / комментариями вручную)
Изменить: Изменено, чтобы исключить ненужные Forward
, в соответствии с предложениями Пола МакГира.
Чтобы получить вывод в формате вложенного списка:
res = parens.parseString("((12 + 2) + 3)")
res.asList()
Выход:
[[['12', '+', '2'], '+', '3']]