String zerteilen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kun1803
User
Beiträge: 5
Registriert: Dienstag 4. Dezember 2012, 12:59

Hallo,
ich habe folgende Frage:
Ich möchte eine Rechnung als String eingeben. (zB: 5+6*7)
Und dann das Ergebnis herausbekommen.

Jetzt versuche ich die ganze Zeit den String aufzuteilen. Aber ich schaffe es nur das ich die Zahlen (durch den SPLIT Befehl) bekomme aber nicht die Operatoren.

Hat jmd eine Idee.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Besteht die Übung daraus selber den String zu parsen und dann auszuwerten, wenn nicht schau dir mal literal_eval im ast modul an.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
kun1803
User
Beiträge: 5
Registriert: Dienstag 4. Dezember 2012, 12:59

Übungsaufgabe dahinter ist ein Taschenrechner.
In dem soll der String eingegeben werden und irgendwie über eine
Get Lexeme und next zocken Methode berechnet werden
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Also das Zerteilen, kannst du mit re.split machen... Ist die Frage, ob das der richtige Weg ist. Da habe ich keine Erfahrung ;)
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Uni oder Schule? Und muss Punkt- vor Strichrechnung beachtet werden?

Zeig doch mal her, was du bisher hast.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

JonasR hat geschrieben:Also das Zerteilen, kannst du mit re.split machen.
Und zwar wie folgt:

Code: Alles auswählen

>>> re.split(r'(\D+)', '5 +6*7 ')
['5', ' +', '6', '*', '7', ' ', '']
Weiterverarbeiten musst du es dann schon noch selber.
kun1803
User
Beiträge: 5
Registriert: Dienstag 4. Dezember 2012, 12:59

Okay danke, das ist ein guter Anstoß.


Hier die orginal Aufgabenstellung, falls sich jemand dafür interessiert.

Aufgabe 4.1: get lexem Punkte:  / 10
(a) (5 Punkte) Implementieren Sie die Funktion get lexeme mit der Signatur:
get_lexeme(string:str) -> (str, str)
Die Funktion soll mit Hilfe des Wo ̈rterbuches TOKENS aus dem String string
Das am weitesten links stehende Lexem ermitteln. Die Ru ̈ckgabe der Funktion ist vom Typ tuple und setzt sich aus dem gefundenen Lexem und dem verblei- benden Rest von string zusammen. Fu ̈r z.B. get_lexeme("23+2-4;") ist die Ru ̈ckgabe ("23", "+2-4;").
Ein Wo ̈rterbuch fu ̈r die Terminale + und - ist Beispielsweise: TOKENS = {’PLUS’:’+’, ’MINUS’:’-’}
(b) (5 Punkte) Erweitern Sie die Funktion get lexeme dahingehend, das ein Ter- minalsymbol, der Grammatik, aus mehr als einem einzelnen Zeichen bestehen kann; z.B. fu ̈r Operatoren wie ** zum Rechnen mit Exponenten.
Aufgabe 4.2: next token Punkte:  / 10
(a) (5 Punkte) Implementieren Sie die Funktion next_token() zum Ermitteln des na ̈chsten Token der (globalen) Eingabe. Ein Token setzt sich aus einem Lexem und einem Typ zusammen. Fu ̈r das Lexem "23" ist der zugeho ̈rige Typ, in der Grammatik des Taschenrechners, decimal.
(b) (5 Punkte) Gestalten Sie die Funktion next token benutzerfreundlich, so das u ̈berflu ̈ssige Leerzeichen und das Fehlen des Semikolons, nach der letzten Anwei- sung, keinen Fehler darstellen.
Aufgabe 4.3: Der Taschenrechner Punkte:  / 20
(a) (10 Punkte) Implementieren Sie die Kernfunktionalita ̈t des Taschenrechners an- hand der gegebenen Grammatik und unter Verwendung der beiden Funktionen get lexeme und next token. Erstellen und verwenden Sie hierzu die drei Funktionen expression, term und primary. Passen Sie das Wo ̈rterbuch TOKENS so an, dass es der in der Grammatik beschrieben Sprache gerecht wird.
(b) (5 Punkte) Erweitern Sie die Grammatik - und damit ihr Programm - so das der Taschenrechner mit ganzzahliger Division (:) und Modulo-Arithmetik ( (%)) rechnen kann.
(c) (5 Punkte) Erweitern Sie ihren Taschenrechner um eine Funktion zur Fehlerbe- handlung error(description:str) -> None. Neben einem Beschreiben- den Text des Fehlers (description) soll die Gesamtzahl der aufgetretenen Fehler geza ̈hlt und ausgegeben werden.
Aufgabe 4.4: Testen Punkte:  / 10
Erstellen Sie fu ̈r ihr Programm eine Zweigu ̈berdeckende Testmenge und dokumentie- ren Sie diese unter Verwendung der Konventionen des Moduls doctest.


Code: Alles auswählen

 program     = {expressions}, END;
   expressions = expression, PRINT, {expressions};
   expression  = [expression, ( PLUS | MINUS ),] term;
term primary
decimal
name
letter
uppercase
lowercase
digit
END
PRINT
PLUS
MINUS
MUL
DIV
ASSIGN
LEFT_PAR
RIGHT_PAR
= [term, ( DIV | MUL ),] primary;
= decimal |
  name, [ ASSIGN, expression ] |
  MINUS, primary |
  LEFT_PAR, expression, RIGHT_PAR;
= {digit}, [’.’], digit, {digit} |
  digit, {digit}, ’.’;
= letter, {letter};
= uppercase | lowercase;
= ’A’|’B’|’C’|’D’|’E’|’F’|’G’|’H’|’I’|
  ’J’|’K’|’L’|’M’|’N’|’O’|’P’|’Q’|’R’|
  ’S’|’T’|’U’|’V’|’W’|’X’|’Y’|’Z’;
= ’a’|’b’|’c’|’d’|’e’|’f’|’g’|’h’|’i’|
  ’j’|’k’|’l’|’m’|’n’|’o’|’p’|’q’|’r’|
  ’s’|’t’|’u’|’v’|’w’|’x’|’y’|’z’;
= ’0’|’1’|’2’|’3’|’4’|’5’|’6’|’7’|’8’|’9’;
= ’’; (* Leere Eingabe *)
= ’;’;
= ’+’;
= ’-’;
= ’*’;
= ’/’;
= ’=’;
= ’(’;
= ’)’;
kun1803
User
Beiträge: 5
Registriert: Dienstag 4. Dezember 2012, 12:59

Code: Alles auswählen


str_input = input("Geben Sie ihre Rechnung ein")

calclist = (str_input.split(r'(\D+)'))



print(calclist)





    
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

/me hat geschrieben:
JonasR hat geschrieben:Also das Zerteilen, kannst du mit re.split machen.
Und zwar wie folgt:

Code: Alles auswählen

>>> re.split(r'(\D+)', '5 +6*7 ')
['5', ' +', '6', '*', '7', ' ', '']
Weiterverarbeiten musst du es dann schon noch selber.
Den Spaß wollte ich ihm noch lassen :D:D
kun1803
User
Beiträge: 5
Registriert: Dienstag 4. Dezember 2012, 12:59

Was ist den dieses RE
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

kun1803 hat geschrieben:Was ist den dieses RE
re
Das Leben ist wie ein Tennisball.
lunar

@kun1803 Offenbar sollst Du einen vollständigen Lexer und Parser für diese Ausdrücke schreiben. Dazu brauchst Du entsprechendes Grundwissen, unter anderem auch über reguläre Ausdrücke, welches man Dir im Laufe der Vorlesung sicherlich auch vermittelt hat. Gehe also erst einmal das Skript durch, und stelle sicher, dass Du auch die Grundlagen verstanden hast.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

EyDu hat geschrieben:
kun1803 hat geschrieben:Was ist den dieses RE
re
Hab dir im übrigen die Funktion auch verlinkt.
Antworten