Mathematische Operationen von string [duplicate]

Diese Frage hat hier schon eine Antwort:

  • Die Auswertung eines mathematischen Ausdrucks in einem String 12 beantwortet

Nehmen wir an, ich habe eine Standard-Python-String (wie raw_input() eine von raw_input() ), vielleicht "2 + 2" aus Gründen der Einfachheit.

Ich möchte diese Zeichenfolge in Standardmathematikoperationen in Python umwandeln, so dass "2 + 2" 4 .

Gibt es eine einfache Möglichkeit, dies zu tun, oder hätte ich auf die Räume zu teilen und jede Zahl / Symbol manuell zu analysieren, dann mach die Mathematik auf, was ich finde?

Will ich Regex?

8 Solutions collect form web for “Mathematische Operationen von string [duplicate]”

Verwenden Sie die eval-Funktion.

 print eval('2 + 4') 

Ausgabe:

 6 

Sie können sogar Variablen oder regelmäßigen Python-Code verwenden.

 a = 5 print eval('a + 4') 

Ausgabe:

 9 

Sie können auch Rückgabewerte erhalten:

 d = eval('4 + 5') print d 

Ausgabe:

 9 

Oder rufen sie an:

 def add(a, b): return a + b def subtract(a, b): return a - b a = 20 b = 10 print eval('add(a, b)') print eval('subtract(a, b)') 

Ausgabe:

 30 10 

Wenn Sie einen Parser schreiben möchten, vielleicht können Sie stattdessen einen Python-Code-Generator erstellen, wenn das einfacher ist und eval verwenden, um den Code auszuführen. Mit eval kannst du jede Python-Evalution ausführen.

Auf der anderen Seite, wie andere schon erwähnt haben, ist eval nicht sicher, so benutze es mit Bedacht.

Der einfachste Weg ist, eval wie zu verwenden:

  >>> eval("2 + 2") 4 

Achten Sie auf die Tatsache, dass ich Leerzeichen in der Zeichenfolge enthalten. eval wird einen String ausführen, als ob es ein Python-Code wäre, also wenn du die Eingabe in einer anderen Syntax als Python haben möchtest, solltest du den String selbst analysieren und berechnen, zB eval("2x7") würde dir nicht 14 geben Weil Python * für Multiplikationsoperator anstelle von x .

Regex hilft nicht viel. Zuerst wollen Sie die Betreiber Vorrang zu berücksichtigen, und zweitens müssen Sie mit Klammern arbeiten, die mit regex unmöglich ist.

Je nachdem, was genau Art von Ausdruck, den Sie parsen müssen, können Sie entweder Python AST oder (eher) pyparsing versuchen . Aber vor allem würde ich empfehlen, etwas über die Syntaxanalyse im Allgemeinen und den Shunting Yard Algorithmus im Besonderen zu lesen.

Und kämpfe um die Versuchung, eval benutzen, das ist nicht sicher.

Wenn du es sicher machen willst, kannst du http://docs.python.org/library/ast.html#ast.literal_eval verwenden

Von dieser Antwort: Python "safe" eval (string to bool / int / float / None / string)

Es könnte nicht Mathe machen, aber man könnte die Mathematik-Operatoren analysieren und dann auf sicher ausgewertete Begriffe arbeiten.

Der Asker kommentierte:

Ich finde das, wenn ich ein Problem gut genug verstehe, um ein Programm zu schreiben, das es herausfinden kann, muss ich die Arbeit nicht manuell machen.

Wenn er einen mathematischen Ausdruckslöser als Lernübung schreibt, wird mit eval() nicht helfen. Außerdem ist es schreckliches Design.

Sie könnten erwägen, einen Rechner mit Reverse Polish Notation anstelle von Standard-Mathematik Notation. Es vereinfacht das Parsing erheblich. Es wäre noch eine gute Übung

Sie können diese Funktion verwenden, die das gleiche wie die Funktion eval() , aber auf einfache Weise mit einer Funktion.

 def numeric(equation): if '+' in equation: y = equation.split('+') x = int(y[0])+int(y[1]) elif '-' in equation: y = equation.split('-') x = int(y[0])-int(y[1]) return x 

Ein einfacher Weg, aber gefährlicher Weg, dies zu tun wäre, um eval() . eval() führt den String als Code aus. Das Gefährliche daran ist, dass, wenn diese Saite aus Benutzereingaben gewonnen wird, sie böswillig Code ausführen können, der den Computer brechen könnte. Ich würde die Eingabe bekommen, check it mit einem Regex, und dann ausführen, wenn Sie feststellen, ob es OK ist. Wenn es nur im Format "Nummer Operation Nummer" sein wird, dann könnten Sie eine einfache Regex verwenden:

 import re s = raw_input('What is your math problem? ') if re.findall('\d+? *?\+ *?\d+?', s): print eval(s) else: print "Try entering a math problem" 

Ansonsten müsstest du etwas ein bisschen strengeres als dieses haben. Sie können es auch umgekehrt tun, indem Sie eine Regex verwenden, um zu finden, ob bestimmte Dinge nicht darin sind, wie z. B. Zahlen und Operationen. Auch können Sie überprüfen, ob die Eingabe bestimmte Befehle enthält.

Der beste Weg wäre zu tun:

print eval("2 + 2")

Wenn du wolltest, könntest du eine Variable benutzen:

addition = eval("2 + 2") print addition

Wenn du es wirklich wolltest, könntest du eine Funktion benutzen:

def add(num1, num2): eval("num1 + num2")

  • Mehrfache Zeichen ersetzen mit Python
  • Spalte einen String nur durch den ersten Platz in Python
  • Wie finde und finde ich alle Vorkommen eines Teilstrings in einer Zeichenkette, indem ich nur finden und ersetzen?
  • Gleitkommazahl auf bestimmte Präzision umwandeln und dann in String kopieren
  • Bequemer Weg, um lange SQL-Anweisungen in Javascript zu verpacken
  • String-Count mit überlappenden Ereignissen
  • Wie gebe ich einen Regex in string.replace ein?
  • Python: finding substring innerhalb einer liste
  • Python ist die beste Programmiersprache der Welt.