Wie holt man die Zahlen und Zeichen aus einer Python Zeichenkette?

4 Antworten

Hey,

der String an sich ist schon eine liste auch einzelnen Char‘s, das bedeutet du kannst auf jedes Element via dem Indexoperator zugreifen.

string[0] //gibt das erste Zeichen deines Strings aus, 1 das zweite usw.

Ich wenn du tatsächlich alle Zeichen in deinem Taschenrechner aneinanderreihst, kannst du nach jedem operator (hoffentlich sind’s nicht zu viele) zu suchen via find().

plus_position = string.find("+") //gibt dir die position des + Symbols

Alternativ kannst du auch über deinen string interieren, hierfür kannst du die länge bestimmen und danach mit einer for schleife über den string iterieren. Und dabei auf vorhandensein des operator symbols prüfen. Gleichzeitig einen Hilfsstring anlegen welcher die letzten Zeichen speichert, welche du dann jeweils in einen Array packen kannst.

Mit freundlichen Grüßen,

Nico


GruseINico  16.06.2022, 20:13

Aber du brauchst auch garnicht die länge des Strings bestimmen, es sollte auch mit

for x in string
  code

gehen

Alex950130 
Beitragsersteller
 16.06.2022, 20:23
@Alex950130

Ich habe es mit find versucht:

string = "x +++"

find_plus = string.find("+")

Aber ich bekomme nur die possition des ersten plusses. Kann ich irgendwie alle Positionen von den lussen bekommen?

Die Zerlegung einer Zeichenreihenennt man Tokenizing. Probiere mal folgendes:

import tokenize
from io import StringIO
token_list = [t.string for t in tokenize.generate_tokens(StringIO("13/5*7").readline)]

print(token_list)

Das Ergebnis ist:

['13', '/', '5', '*', '7', '', '']

Das ist im wesentlichen das, was du haben willst - wenn man mal von den beiden letzten Listenelementen absieht.

Diese Listenelemente kriegst du weg, wenn du folgendes machst:

import tokenize
from io import StringIO
token_list = [t.string for t in tokenize.generate_tokens(StringIO("13/5*7").readline)]

print(token_list[0 : len(token_list) - 2])

Sieht leider ziemlich kompliziert aus. Eine einfachere Lösung wäre schön.

Woher ich das weiß:Berufserfahrung – Berufstätigkeit als Software-Entwickler

Alex950130 
Beitragsersteller
 16.06.2022, 20:47

Danke, sieht wirklich kompliziert aus. Als ich noch wirklicher Anfänger war, habe ich nichtmal den Unterschied zwischen print() und input() verstanden.

Du könntest mit re.split('(\d+)', string) den String string an den Zahlen aufsplitten. Also beispielsweise so...

import re
string = "13/5*7"
print(re.split('(\d+)', string))

Dieser Code liefert als Ausgabe:

['', '13', '/', '5', '*', '7', '']

GuteAntwort2021  16.06.2022, 20:38

Wird string dadurch zur Liste? Ah, nevermind. Kann man leicht umwandeln.

mihisu  16.06.2022, 20:41
@GuteAntwort2021

Nein, nicht direkt.

Man könnte aber natürlich die so erzeugte Liste der Variablen string zuweisen, wenn man möchte...

import re
string = "13/5*7"
string = re.split('(\d+)', string)

Dann ist string eine Liste mit string[1] == '13' und string[2] == '/' und string[3] == '5' und string[4] == '*' und string[5] == '7'.

Alex950130 
Beitragsersteller
 16.06.2022, 20:42

Danke, die ersten und die letzten Zeichen kann ich auch wegmachen. Sonst cool.

mihisu  16.06.2022, 20:52
@Alex950130

Die leeren Strings kann man natürlich noch rausfiltern, wenn man möchte. Beispielsweise so...

import re
string = "13/5*7"
string = re.split('(\d+)', string)
string = [s for s in string if s]

Beachte jedoch, dass dann '13' nicht mehr string[1] ist, sondern string[0]. Das würde dann, genau genommen, nicht mehr deiner Fragestellung entsprechen.

„string[1] soll 13 sein“

============

Wenn man möchte, kann man dann auch noch die Zahlen gleich als Integer (Ganzzahl) in die Liste schreiben, statt als String. Beispielsweise so...

import re
string = "13/5*7"
string = re.split('(\d+)', string)
string = [int(s) if s.isdigit() else s for s in string if s]
Alex950130 
Beitragsersteller
 24.06.2022, 22:06
@mihisu

Oh, ich habe mich "verdacht"... Eigentlich sollte es einfach das erste sein, aber ob 1 oder 0, das ist das gleiche... Aber ich hätte die überflüssigen Lücken mit dem Code:

string = string[1:-1]

rausfiltern. Finde das halt einfacher... Aber danke.

Okay, habe für dich nachgebessert:

l = list(input())

for i in range(1,len(l)-1):
  if(i >= len(l)):
    break
  if l[i].isnumeric() and l[i-1].isnumeric():
    l[i-1] += l[i]
    l.pop(i)
      
print(l)

Sollte der String schon vorliegen, dann in der ersten Zeile

input()

durch die Stringvariable ersetzen.

...............

Die Eingabe

13*5/7

führt zur Ausgabe

['13', '*', '5', '/', '7']

BorisG2011  16.06.2022, 20:31

Diese Lösung gefällt mir sogar besser als das, was ich selbst zu dieser Frage geschrieben habe.

Alex950130 
Beitragsersteller
 16.06.2022, 20:44

Danke, aber bekomme ich auch bei anderen Aufgaben wie 1/5*55 soeine Lösung? Irgendwie sieht es aus, als wäre die Lösung nur für diese Aufgabe gedacht.

GuteAntwort2021  16.06.2022, 20:57
@Alex950130

Mein Lösungsvorschlag ist universell einsetzbar.

Die Eingabe

1/5*55

führt zur Ausgabe

['1', '/', '5', '*', '5', '5']

Allerdings würde ich empfehlen, die Variante von mihisu zu nehmen. Mit regular Expressions zu arbeiten, ist da durchaus sinnvoller und performanter. Meine Variante funktioniert zwar ebenfalls, allerdings ist das Rumwerkeln an Listen nicht gerade effizient.