Seite 1 von 1
String zerteilen
Verfasst: Dienstag 4. Dezember 2012, 13:06
von kun1803
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.
Re: String zerteilen
Verfasst: Dienstag 4. Dezember 2012, 13:35
von jbs
Besteht die Übung daraus selber den String zu parsen und dann auszuwerten, wenn nicht schau dir mal literal_eval im ast modul an.
Re: String zerteilen
Verfasst: Dienstag 4. Dezember 2012, 13:50
von kun1803
Übungsaufgabe dahinter ist ein Taschenrechner.
In dem soll der String eingegeben werden und irgendwie über eine
Get Lexeme und next zocken Methode berechnet werden
Re: String zerteilen
Verfasst: Dienstag 4. Dezember 2012, 14:09
von JonasR
Also das Zerteilen, kannst du mit
re.split machen... Ist die Frage, ob das der richtige Weg ist. Da habe ich keine Erfahrung

Re: String zerteilen
Verfasst: Dienstag 4. Dezember 2012, 14:29
von jbs
Uni oder Schule? Und muss Punkt- vor Strichrechnung beachtet werden?
Zeig doch mal her, was du bisher hast.
Re: String zerteilen
Verfasst: Dienstag 4. Dezember 2012, 14:30
von /me
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.
Re: String zerteilen
Verfasst: Dienstag 4. Dezember 2012, 14:35
von kun1803
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 *)
= ’;’;
= ’+’;
= ’-’;
= ’*’;
= ’/’;
= ’=’;
= ’(’;
= ’)’;
Re: String zerteilen
Verfasst: Dienstag 4. Dezember 2012, 14:46
von kun1803
Code: Alles auswählen
str_input = input("Geben Sie ihre Rechnung ein")
calclist = (str_input.split(r'(\D+)'))
print(calclist)
Re: String zerteilen
Verfasst: Dienstag 4. Dezember 2012, 14:49
von JonasR
/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
Re: String zerteilen
Verfasst: Dienstag 4. Dezember 2012, 15:04
von kun1803
Was ist den dieses RE
Re: String zerteilen
Verfasst: Dienstag 4. Dezember 2012, 15:06
von EyDu
kun1803 hat geschrieben:Was ist den dieses RE
re
Re: String zerteilen
Verfasst: Dienstag 4. Dezember 2012, 15:16
von 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.
Re: String zerteilen
Verfasst: Dienstag 4. Dezember 2012, 15:19
von JonasR
EyDu hat geschrieben:kun1803 hat geschrieben:Was ist den dieses RE
re
Hab dir im übrigen die Funktion auch verlinkt.