2012-02-06 16 views
2

与えられたexampleString = "[9+[7*3+[1+2]]-5]" []で囲まれた要素を抽出して格納するにはどうすればよいですか?ネストされた文字列要素を格納および評価する

1+2 --+ 
     | 
    7*3+3 --+ 
      | 
     9+24-5 

何らかのネストされたリストを作成する必要がありますか?申し訳ありません、これはやや

私は、この質問は実際には広すぎます...その文字列からネストされたリストを作成する方法はありますか?または、単に各要素の正規表現検索を行い、それぞれを評価する必要がありますか?ネストされたリストオプション(存在する場合)は、同じ文字列をループし、theresがなくなるまで評価するよりも、よりクリーンな方法です。

+2

あなたは中間値を必要としない場合は、単純な検索/置換することは、evalのに続いて、括弧の中に括弧に変わり、正常に動作します。 – Triptych

+0

英語には大きな問題はありません。 (些細な問題には小文字の固有名詞と疑問符で終わらない質問が含まれます)あなたの質問に直接答えることはできませんが、*解析ツール*を検索することをお勧めします。 (あなたが好きなのであればPythonの解析ツールを使用していますが、あなたの例はPython特有のものではありません) – kojiro

+0

簡単な評価をするには、 'eval(exampleString.replace( '['、 '(')).replace ] '、') ')) ' – juliomalegria

答えて

1

は、正規表現のソリューションです:

import re 

def evaluatesimple(s): 
    return eval(s) 

def evaluate(s): 
    while 1: 
    simplesums=re.findall("\[([^\]\[]*)\]",s) 
    if (len(simplesums) == 0): 
     break 
    replacements=[('[%s]' % item,str(evaluatesimple(item))) for item in simplesums] 
    for r in replacements: 
     s = s.replace(*r) 
    return s 

print evaluate("[9+[7*3+[1+2]]-5]") 

しかし、あなたは全体の豚を行くと、後で評価するために、ツリーを構築したい場合は、同じ技術を使用しますが、辞書内の式とサブ式を保存することができます:

def tokengen(): 
    for c in 'abcdefghijklmnopqrstuvwyxz': 
    yield c 

def makeexpressiontree(s): 
    d=dict() 
    tokens = tokengen() 
    while 1: 
    simplesums=re.findall("\[([^\]\[]*)\]",s) 
    if (len(simplesums) == 0): 
     break 
    for item in simplesums: 
     t = tokens.next() 
     d[t] = item 
     s = s.replace("[%s]"% item,t) 
    return d 

def evaltree(d): 
    """A simple dumb way to show in principle how to evaluate the tree""" 
    result=0 
    ev={} 
    for i,t in zip(range(len(d)),tokengen()): 
    ev[t] = eval(d[t],ev) 
    result = ev[t] 
    return result 

s="[9+[7*3+[1+2]]-5]" 
print evaluate(s) 
tree=makeexpressiontree(s) 
print tree 
print evaltree(tree) 

(私の答えを拡張するために編集)

+0

ありがとう、それは便利なコードになります。ネストされたリストとは対照的に、これが最も簡単にアプローチできると思います。 – Firebowl2000

2

良い出発点はshunting-yard algorithmです。

オンラインで利用できるPythonの実装は複数あります。ここはoneです。

このアルゴリズムは、中置表記をさまざまな表現に変換するために使用できます。どの表現を使用できるかについて制約を受けていない場合は、Reverse Polish notationと考えることをお勧めしたいと思います。

3

pyparsingモジュールといくつかの例があります(four function calculatorはあなたが望むものです)。

PS。そのコードのサイズが心配している場合は、もう一度見てください:これのほとんどは取り除くことができます。下半分は単なるテストです。上部は、e/pi/...定数、三角関数などをサポートするようなものからはずすことができます。必要なものを10行に減らすことができます。ここで

+1

私は2番目のpyparsingに行くつもりです、それは正確に_これを始めるために必要なものです。あなたが書いたいのはパーサではなく、(文脈自由な)言語の文法です。私のために、また価値のある価値のある、始めるためのガイドhttp://shop.oreilly.com/product/9780596514235.doは、すぐに始めるための道具でした。 – Hooked

+1

[pyparsing](http://pyparsing.wikispaces.com/)モジュールには多くの有用なものがあります。その特定の[4関数計算機](http://pyparsing.wikispaces.com/file/view/fourFn.py)は、基本的な数式表現やeval()のやや安全な代替には非常に便利です。また、[nested.py](http://pyparsing.wikispaces.com/file/view/nested.py)に表示されている例は、ネストされたタグを**ネストされたリスト**に変換するようです。感謝 – Firebowl2000

関連する問題