0

私のプログラムは単純な電卓なので、入力をよりユーザーフレンドリーにするために、ユーザーが入力した式を解析する必要があります。正規表現でできることは知っていますが、これについてはよくわかりません。

したがって、次のような入力を変換する必要があります。

import re
input_user = "23.40*1200*(12.00-0.01)*MM(H2O)/(8.314 *func(2*x+273.15,x))"
re.some_stuff( ,input_user) # ????

これで:

"23.40*1200*(12.00-0.01)*MM('H2O')/(8.314 *func('2*x+273.15',x))"

これらの単純な引用符を括弧内に追加するだけです。どうやってやるの?

アップデート:

より明確にするために、文字列 "MM(" とそれに続く ")" の前、および文字列 "func(" とそれに続く "," の前に単純な引用符を追加します。 .

4

1 に答える 1

2

これは正規表現が機能する種類のものですが、入力がどのようになるかを正確に考慮しない限り、大きな問題を引き起こす可能性があります。たとえば、MM(...) 内にあるものは、独自の括弧を含むことができますか? func( の最初の式にコンマを含めることはできますか? 両方の質問に対する答えが「いいえ」の場合、次のようにすることができます。

 input_user2 = re.sub(r'MM\(([^\)]*)\)', r"MM('\1')", input_user)
 output = re.sub(r'func\(([^,]*),', r"func('\1',", input_user)

ただし、どちらかの質問に対する答えが「はい」の場合、これは機能しません。それがなくても、受け取ると予想される入力の種類によっては問題が発生する可能性があります。基本的に、ここの最初の re.sub は MM( ('MM(') を探し、その後に右括弧 ('([^)]*)') ではない任意の数 (0 を含む) の文字が続きます。次に、グループとして保存され (余分な括弧が原因)、次に閉じ括弧. これは、そのセクションを 2 番目の引数の文字列に置き換えます. \1 は、パターンの最初で唯一のグループに置き換えられます. 2 番目の re .sub も同様に機能し、カンマ以外の任意の数の文字を探します。

いずれかの質問に対する答えが「はい」の場合、言語は正規表現ではないため、正規表現は解析に適していません。この質問に対する答えは、別のアプリケーションについて議論しているときに、その問題についてより多くの洞察を与えるかもしれません.

于 2013-05-20T01:38:37.490 に答える