2

だから私は数式でオペランドと演算の数を検出する方法を理解しようとしていました

元:1+2*9/2

実行する必要のある操作の数と正しい順序(PEDMAS)も確認する必要があるため、関数を使用してオペランドと操作を独自の形式に分離しようとしました。

方程式を取り、すでにすべてのスペースを取り除いたので、方程式のオペランドと演算の数を見つけてから、後でreturnを使用して、ユーザーが指定した数式の答えを見つける必要があります。

任意のヒント?

4

3 に答える 3

1
import re
exp = 1+2*9/2
ops = re.findall(r'[\+\-*/]', exp)
print len(ops)

なぜオペランドの数を見つけたいのかわかりません

re.findall(r'[0-9]+|[\+\-*/()]', exp)

優れている。

だから正規表現はあなたを助けることができると思います

于 2012-11-08T07:04:26.613 に答える
1

If you're allowed to, I'd recommend checking out the ast module. It's designed to do stuff like this for you using Python's own parser.

For an actual application, you'd probably use a parser generator like Ply.

For a simple homework assignment like this, you're probably expected to handcode a parser. First tokenize it (str.split), find the parenthesis, and then use precedence to group the other operations.

于 2012-11-08T06:11:04.043 に答える
1

式がサンプルほど単純でない場合は、RPN - 逆ポーランド記法を使用できます

あなたの式が非常に単純で(基本操作と10未満の値のみ)、次のようなものを使用できるよりもカウントするだけでよい場合:

ops = '+-*/'
operationsCount= sum(expr.count(op) for op in ops)
operandsCount = len(expr) - operationsCount

または、これを使用できます:

def get_cnt(expr):
    ops = '+-*/'
    res = [expr]
    for op in ops:
        tmp = []
        for x in expr:
            tmp.extend(x.split(op))
        res = tmp[:]        
    return len(res), sum(expr.count(op) for op in ops)

これで、多数の演算子とオペランドが得られました。ops/opd で行を正しく分割し、式を計算するのは非常に簡単です。

于 2012-11-08T06:14:21.100 に答える