Parsing Mathe Ausdruck in Python und Lösen, um eine Antwort zu finden

Ich bin ganz neu in der Programmierung. Das ist in Bezug auf python Also die Idee ist, einen Ausdruck wie 3/5 oder höchstens 3/5 * 2 zu nehmen (höchstens zwei Operatoren, beachten Sie, dass die Operatoren irgendwelche von +, -, /, * sein können) und es zu lösen. Der weiße Raum kann überall im Ausdruck existieren.

Der Benutzer gibt den Ausdruck, sagen 3/5, und das Programm muss den Ausdruck lösen und die Antworten anzeigen. Was ich versucht habe, ist unten. Beachten Sie, ich habe nur den ersten Teil versucht, sobald ich den ursprünglichen Ausdruck, den der Benutzer eingibt, richtig teilen kann (was ein String sein würde), das Erstellen von Funktionen wäre der einfache Teil:

expres= str(input("something:")) ssplit= hit.partition("/") onec= int((ssplit[0].lstrip()).rstrip()) twoc= (ssplit[1].lstrip()).rstrip() threec= int((huns[2].lstrip()).rstrip()) print(onec,"...",twoc,"...",threec) #just a debug test print 

So oben kann ich einen Ausdruck wie 3/5 nehmen und ihn in drei getrennte Strings teilen: 3, / und 5. Ich kann auch alle Leerzeichen vor und nach den Operatoren / Operanden entfernen. Ich habe Probleme mit der Spaltung von Ausdrücken wie 4/5 + 6, denn ich kann keinen Code in ssplit [3] oder ssplit [4] setzen und dann einen Ausdruck wie 3/5 eingeben, da er nicht definiert wird. Im Grunde brauchte ich Sie helfen, um herauszufinden, wie man einen Ausdruck wie 3 / 4-6, etc. Ich brauche auch Hilfe mit der Zeile " ssplit= hit.partition("/") ", damit sie den eingegebenen Ausdruck betrachten und mit +, – und * auch arbeiten kann. Jede und alle Hilfe wird geschätzt. Auch wenn mein Code oben sieht böse und ineffizient bitte geben Sie mir Kritik. Vielen Dank!

Beachten Sie, ich kann nicht, und wollte nicht eval. Reihenfolge der Operationen ist erforderlich. Ich kann keine komplizierten Befehle verwenden. Ich muss es einfach halten, das meiste, das ich verwenden kann, ist String-Bibliotheken, die zwischen Strings / Integers / Floats etc. umwandeln und wenn, und, etc. Aussagen Ich kann auch Funktionen nutzen.

3 Solutions collect form web for “Parsing Mathe Ausdruck in Python und Lösen, um eine Antwort zu finden”

Wenn ich mich nicht auf externe Bibliotheken verlassen würde, würde ich so etwas tun:

 def parse(x): operators = set('+-*/') op_out = [] #This holds the operators that are found in the string (left to right) num_out = [] #this holds the non-operators that are found in the string (left to right) buff = [] for c in x: #examine 1 character at a time if c in operators: #found an operator. Everything we've accumulated in `buff` is #a single "number". Join it together and put it in `num_out`. num_out.append(''.join(buff)) buff = [] op_out.append(c) else: #not an operator. Just accumulate this character in buff. buff.append(c) num_out.append(''.join(buff)) return num_out,op_out print parse('3/2*15') 

Es ist nicht das eleganteste, aber es bekommt man die Stücke in einer vernünftigen Datenstruktur (soweit ich sowieso besorgt bin)

Jetzt Code zu tatsächlich analysieren und bewerten die Zahlen – Dies wird alles in Gleitkomma tun, wäre aber einfach genug, um zu ändern …

 import operator def my_eval(nums,ops): nums = list(nums) ops = list(ops) operator_order = ('*/','+-') #precedence from left to right. operators at same index have same precendece. #map operators to functions. op_dict = {'*':operator.mul, '/':operator.div, '+':operator.add, '-':operator.sub} Value = None for op in operator_order: #Loop over precedence levels while any(o in ops for o in op): #Operator with this precedence level exists idx,oo = next((i,o) for i,o in enumerate(ops) if o in op) #Next operator with this precedence ops.pop(idx) #remove this operator from the operator list values = map(float,nums[idx:idx+2]) #here I just assume float for everything value = op_dict[oo](*values) nums[idx:idx+2] = [value] #clear out those indices return nums[0] print my_eval(*parse('3/2*15')) 

Das ist nicht wirklich der Weg, um einen Ausdruck zu analysieren, du solltest mehr in Lexers und Parser schauen, so etwas wie PLY oder pyparsing . Allerdings, wenn Sie nur wollen, um den Ausdruck zu bewerten, können Sie eval(expr) . Beachten Sie, dass eval jeden Code ausführen wird, den Sie füttern, also ist es nicht wirklich sicher.

Bearbeiten Es gibt ein Beispiel hier für die Verwendung von Pyparsing, das sollte Ihnen den Start:

Pyparsing Beispiel

Verwenden Sie das shlex und StringIO Python-Modul. In Python 2.3+:

>>> from StringIO import StringIO

>>> import shlex

>>> input = StringIO('3/4+5')

>>> list(shlex.shlex(input))

['3', '/', '4', '+', '5'] `

  • Python-Verknüpfung von Strings - UnicodeDecodeError: 'ascii' Codec kann kein Byte decodieren
  • Spalte nicht doppelte Wörter mit Python String Split ()?
  • Umgekehrte Wortreihenfolge einer Zeichenfolge ohne Str.split () erlaubt
  • Konvertieren einer Stringdarstellung einer Liste in ein aktuelles Listenobjekt [doppelte]
  • Singular und Plural Phrase Matching in Pandas
  • Python: Ersetzen Sie die Begriffe in einer Zeichenfolge mit Ausnahme der letzten
  • Python entkommt Sonderzeichen in sys argv
  • Python: Wie kann ich einen String als Referenz übergeben?
  • Wie bekomme ich das Zeichen in einer String in Python?
  • Was bedeutet ein führender `\ x` in einer Python-Zeichenfolge` \ xaa`
  • 'Str' Objekt unterstützt keine Objektzuordnung in Python
  • Python ist die beste Programmiersprache der Welt.