2010-12-06 13 views
2

すべての括弧の文字列を分割する基準に従って、文字列を部分文字列のリストに分割する必要があります。式の分割

私は(9+2-(3*(4+2)))と言いますが、(4+2),(3*6)および(9+2-18)を取得する必要があります。

基本的な目的は、内側のかっこのどちらが最初に実行され、次に実行されるかを知ることです。

助けてください....


あなたが再モジュールを用いる方法を提案することができればそれが役立つだろう。ちょうどこれはみんなのためのもので、宿題ではなく、私はポーランド語表記を理解しています。私が探しているのは、少ないコード行でPythonとモジュールを使用してそれを使用することです。これは非常にhomeworkish聞こえる

+2

はこの宿題ですか? – kzh

+0

あなたの文法は()の数字と基本的な演算子+ -/*に制限されていますか? – kevpie

+0

いいえ、そうではありません。 –

答えて

4

evalは安全ではないため、入力文字列で危険なものをチェックする必要があります。

>>> import re 
>>> e = "(9+2-(3*(4+2)))" 
>>> while '(' in e: 
...  inner = re.search('(\([^\(\)]+\))', e).group(1) 
...  e = re.sub(re.escape(inner), eval('str'+inner), e) 
...  print inner, 
... 
(4+2) (3*6) (9+2-18) 
0

おかげでたくさん....ので、私は正しい道ダウンあなたを導くかもしれないいくつかの良い読書で返答するつもりです。 http://en.wikipedia.org/wiki/Polish_notationをご覧ください。あなたが望むものではありませんが、理解はあなたを答えに近づけるでしょう。

0

私はあなたが何をしたいのかを正確に知りませんが、あなたが他の操作を追加したいと場合は、表現をより細かく制御したい場合、私はあなたがパーサーを使用することをお勧め

http://www.dabeaz.com/ply/ < - プライ、例えば

1

はこのような何か試してみてください:

import re 
a = "(9+2-(3*(4+2)))" 
s,r = a,re.compile(r'\([^(]*?\)') 
while('(' in s): 
    g = r.search(s).group(0) 
    s = r.sub(str(eval(g)),s) 
    print g 
    print s 
+0

パウロは私にそれを打つ。 – kzh

+0

マッチングする文字列の説明が正しかったかどうかを知ることができますか?文字列が最初から始まり、それを通過すると文字列と一致します(そして、少なくとも1つはそこになければなりません。 ? –