6

私が持っている場合:

statement = "(2*(3+1))*2"

私が書いている数学リーダーのために、括弧内の複数の括弧を処理できるようにしたいです。おそらく私はこれを間違った方法で行っていますが、私の目標は、括弧がなくなるまで再帰的に括弧を深く掘り下げてから、数学演算を実行することでした。したがって、私は最初に焦点を当てたいと思います

"(2*(3+1))" 

次に焦点を当てる

"(3+1)"

フォーカス値を正規表現の開始インデックスと正規表現の終了インデックスに割り当てることで、これを実現したいと考えていました。終了インデックスを見つける方法をまだ理解していませんが、最初に正規表現を一致させることにもっと興味があります

r"\(.+\)" 

一致しませんでした。「一連の括弧内に含まれる任意の 1 つまたは複数の文字」として読みたかったのです。上記の式がPythonの上記のステートメントと一致しない理由を誰かが説明できますか?

4

3 に答える 3

13

私は正規表現が大好きです。私はいつもそれらを使用しています。

これには正規表現を使用しないでください。

数式を実際に解析する実際のパーサーが必要です。あなたはこれを読みたいかもしれません:

http://effbot.org/zone/simple-top-down-parsing.htm

実際に式を解析したら、解析ツリーをたどって結果を計算するのは簡単です。

編集: @Lattyware は pyparsing を提案しました。これも良い方法であり、上記の EFFBot ソリューションよりも簡単かもしれません。

https://github.com/pyparsing/pyparsing

4 関数の代数式エバリュエーターの pyparsing サンプル コードへの直接リンクを次に示します。

http://pyparsing.wikispaces.com/file/view/fourFn.py

于 2012-04-19T23:52:16.850 に答える
0

私はおそらくstevehaに同意し、これには正規表現をお勧めしませんが、質問に具体的に答えるには、結果グループを引き出すためにエスケープされていない括弧が必要です(パターンは括弧のみをエスケープしています):

>>> re.match(r"\((.+)\)", "(2*(3+1))*2").group(1)
'2*(3+1)'

そのルートに進むと、一致がなくなるまで一致結果を反復処理し、結果リストを逆にして裏返しにすることができます。

于 2012-04-20T00:29:22.817 に答える