0

したがって、以下のコードは、入力された情報の文字列 (数式) を取得し、find 関数を使用して "*/+-" 内の演算子の 1 つを検索し、それに応じて文字列を区切ります。

def splitting1(z):
    for operators in "*/+-":
        if operators in z:
            position1= z.find(operators)
            position2= z.rfind(operators)
            text_before_operators= (z[:position1]).strip()
            text_after_operators= (z[(position1+1):(position2)]).strip()
            return text_before_operators,text_after_operators

私の問題は、3/5*7thenのような入力式がある場合、 を見つける前position1に最初に見つけることです。コードで「position1」を最も左の演算子に関連付ける必要があります。for/in 関数を使用するときに演算子の優先順位を省略する方法はありますか? そうでない場合は、優先順位を省略できるより優れた文字列マニピュレータがあります。*/

z は入力です。また、あいまいさが生じた場合に備えて、入力は 2 つの演算子に制限されます。

4

2 に答える 2

0

を繰り返し処理して*/+-いるため、最初に見つかった文字が最初に返されます。

基本的に、これらすべての演算子のインデックスを見つけてから、最大または最小を見つけます。文字列の反対側で機能するように、この関数を書き直してみてください。

def find_operator_right(text):
    position = -1

    for oper in '*/+-':
        index = text.rfind(oper)

        if index > position:
            position = index

    return position

もう少し Pythonic なソリューションは次のようになります。

right_index = max(map(text.rfind, '+-/*'))
于 2012-10-30T22:11:43.577 に答える
0

lex しようとしているように見えるので、この目的のために特別に設計されたモジュールを調べることをお勧めしますply

.

そうは言っても、この例では正しい軌道に乗っていると思いますが、いくつかの再帰が欠けています(これらのより一般的なレクサーを作成するため):

def splitting1(z):
    for char in "*/+-":
        if char in z:
            position = z.find(char)
            text_before_operator= (z[:position]).strip()
            text_after_operator= (z[position+1:]).strip()
            return (char, splitting1(text_before_operator), splitting1(text_after_operator))
    return ("number", z)

優先順位に関係なく左端の演算子を見つける方法、つまり演算子の優先順位を省略する方法の 1 つは、繰り返し処理するものを再配置することです。

def splitting2(z):
    for char in z:
        if char in "*/+-":
            position = z.find(char)
            text_before_operator= (z[:position]).strip()
            text_after_operator= (z[position+1:]).strip()
            return (char, splitting2(text_before_operator), splitting2(text_after_operator))
    return ("number", z)

これらの関数は、元の関数とは異なる結果を返すことに注意してください。

于 2012-10-30T22:27:38.750 に答える