0
def parse(expression):
    operators= set("*/+-")
    numbers= set("0123456789")#not used anywhere as of now
    opExtrapolate= []
    numExtrapolate= []
    buff=[]
    for i in expression:
        if i in operators:
            if len(buff) >0: #prevents buff if multiple operators
                numExtrapolate.append(''.join(buff))
            buff= []
            opExtrapolate.append(i)
            opExtrapolation=opExtrapolate
        else:
            buff.append(i)


    numExtrapolate.append(''.join(buff))

    numExtrapolation=numExtrapolate
    print(numExtrapolation)
    print("z:", len(opExtrapolation))
    return numExtrapolation, opExtrapolation

def errors():

    numExtrapolation,opExtrapolation=parse(expression)
    #Error for muliple operators
    if (len(numExtrapolation) ==3) and (len(opExtrapolation) !=2):
        print("Bad1")
    if (len(numExtrapolation) ==2) and (len(opExtrapolation) !=1):
        print("Bad2")
    #

以前の質問に同様のコードを投稿しましたが、この投稿では質問の前提が異なります。

上記のコードは、ユーザーが変数式に入力した数学的な入力を受け取り、それをオペランドと演算子に分割します。エラー関数は、入力が正しくない場合、後でエラーを出力します。

入力は次のようになります。演算子は set("*/+-") にのみ含めることができ、オペランドは実数です。したがって、入力例は 45/23+233 になります。

SO ユーザーの助けを借りて、エラーの 1 つ (複数のオペレーターのエラー) を機能させることができましたが、さらにいくつかのエラー メッセージの実装に問題があります。

1)入力に数値または許可された演算子ではない項目が含まれている場合、エラーメッセージが表示されます

2) ユーザーが .23 や 554 などの数値を入力すると、小数点の前または後に数値がない場合、別のエラーが表示されます (0.23 のような数値で問題ないことに注意してください)。

3) ユーザーがゼロで除算しようとすると、エラーが表示されます。

::私が試したこと:

parse() の else ステートメントで、buff.append(i) に条件を付けて、buff.isdigit()==true の場合にのみそのコードを実行しようとしましたが、buff に数字がないというエラーが発生しました。 . また、「numbers」(以下のコード) というセットを作成し、最初の for ステートメントと同様の for ステートメントを使用して buff.append(i) をそのセットに制限しようとしました。しかし、残念ながら何も機能しませんでした。ありとあらゆる助けをいただければ幸いです。

以下のコードより高度なコードを大量に導入しないでください。コードを完全に変更するのではなく、問題を修正しようとしています。ご助力いただきありがとうございます。

4

2 に答える 2

2

正規表現を使用して、次のチェックを行うことができます。

  1. 入力に数値ではない項目または許可されている演算子ではない項目が含まれている場合は、エラーメッセージが表示されます

    if not re.match(r'[\d.*/+\- ]+$', expression):
        print("Bad3")  # Characters exist that are not allowed
    

    説明:[\d.*/+\- ]数字、演算子、スペース、+これらの文字の1つ以上を許可する手段、および$文字列の最後でのみ一致します。 re.match()文字列の先頭から開始するため、これらの文字のみが許可されます。

  2. ユーザーが.23などの数値を入力した場合(小数点以下または小数点以下の数値がない場合)、別のエラーが表示されます(0.23などの数値で問題ありません)。

    if re.search(r'(?<!\d)\.|\.(?!\d)', expression):
        print("Bad4")  # There is a '.' without a digit before or after it
    

    説明:\.正規表現でリテラル「。」と一致します。キャラクター。真ん中の|は交互であるため、その両側の式が一致する場合、正規表現は一致します。 (?<!\d)前の文字が数字ではないことを(?!\d)意味し、次の文字が数字ではないことを意味します。したがって、この正規表現は「一致する」を意味します。数字が前に付いていないか、「。」と一致します。その後に数字はありません」。

  3. ユーザーがゼロで除算しようとすると、エラーが表示されます。

    if re.search(r'/ *[0.]+(?![.\d])', expression):
        print("Bad5")  # Division by 0
    

    説明:これ/は、任意の数のスペース、次に1つ以上の文字が続く0場合に一致するため、、、、またはのようなものがある.場合に一致します。これは、次の文字を数字や。にすることができないことを意味します。これにより、。のようなものと一致することができなくなります。expression/ 0/ 0.0/ 0.00(?![.\d])./ 0.4

于 2012-11-02T18:19:03.183 に答える
1

私はあなたにいくつかの兆候を与えますが、あなたのためにそれを解決しません:)。さらに必要な場合は、正確な質問をしてください。回答します。

私があなたに与える答えはあなたのコードに直接関係していません。

文字列変数をキャストしてみると、文字列変数が整数になり得るかどうかをテストできます。

try:
    var2 = int(var)

私はあなたにそれが与えるエラーを見てみましょう

tryを使用しないバージョンについては、isdigitメソッドを確認できます。

演算子の1つである場合は、文字列変数をチェックすることで確認できます。

if (var in ["+", "-", "/", "*"])

さらに確認するには、最初に変数の長さを確認できます

if len(var) != and ... see above

ユーザーが.543のようなものを入力して拒否し、文字列変数の最初の要素を確認できるかどうかを確認するには、次のようにします。

if myvar[0] is ".":

ユーザーが0で除算するかどうかを確認するには、最後の数値が0に等しいかどうかを確認するだけです。

if int(myvar) == 0:

ただし、これらはすべて、最初に演算子と数値を取得できることを期待しています。

もう1つの解決策は、正規表現を使用して、数値と演算子を解析する前にこれらのチェックを実行することです。宿題なので、達成しようとしている運動と比べるとかなり複雑に見えます。とにかくそれらを見るのは良い考えかもしれません。

于 2012-11-02T18:18:10.303 に答える