2013-05-13 2 views
4

У меня есть куча математических выражений, хранящихся в виде строк. Вот короткий:Python: Разделение строки на подстроки

stringy = "((2+2)-(3+5)-6)" 

Я хочу, чтобы разбить эту строку вверх в список, который содержит только информацию в каждой «юг в скобках фразы» Так (я уверен, что есть лучший способ выражения этого.) мой выход будет:

['2+2','3+5'] 

у меня есть несколько идей о том, как это сделать, но я продолжать работать в «хорошо, теперь, что» вопрос.

Например:

for x in stringy: 
    substring = stringy[stringy.find('('+1 : stringy.find(')')+1] 
    stringlist.append(substring) 

Работы просто персиковый вернуться 2 + 2, но это о том, насколько это идет, и я полностью прикрывать о том, как пройти через оставшуюся ...

+5

написать фактический парсер. (Использование [pyparsing] (http://pyparsing.wikispaces.com/) или [Parsley] (https://pypi.python.org/pypi/Parsley) или [ANTLR] (http://www.antlr3.org /) или что-то еще.) – millimoose

+0

Но эта проблема разрешима в O (n), так как она сглаживается до слова проблема правильных грамматик, тогда как парсеру требуется хотя бы O (n^3), так как для этого нужны контекстуальные грамматики. И синтаксический анализатор - это намного больше кода для написания, но, безусловно, ... –

+1

Что вы хотите сделать, скажем, '((2 * (2 + 2)) - (3 + 5) -6)'? Если вы получаете '2 * (2 + 2)', '2 + 2', то и другое, или нет? – abarnert

ответ

2

Один из способов, используя регулярное выражение:

import re 
stringy = "((2+2)-(3+5)-6)" 
for exp in re.findall("\(([\s\d+*/-]+)\)", stringy): 
    print exp 

Выход

2+2 
3+5 
1

Вы можете использовать регулярные выражения, как следующее:

import re 

x = "((2+2)-(3+5)-6)" 

re.findall(r"(?<=\()[0-9+/*-]+(?=\))", x) 

Результат:

['2+2', '3+5'] 
1

Ответ и проблемы с регулярными выражениями можно найти в аналогичный вопрос: Regular Expression to match outer brackets

+0

Много материала для чтения, спасибо за ссылку на дополнительную информацию! – user2113818

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