Forum: PC-Programmierung String Leerstellen entfernen und in array umwandeln


von Leon (Gast)


Lesenswert?

Hi, hätte eine Frage:

ich habe einen string:

string = "Monitor      Computer   handy"

In diesem string sind unterschiedlich viele leerstellen zwischen den 
elementen. Ich hatte jetzt probiert dies mit dem replace zu trennen.

string_ohneleer = string.replace(" ", "")

Jetzt möchte ich allerdings den string in eine liste umwandeln. Hier 
hatte ich leider noch keine Lösung gefunden, da der replace alle 
elemente direkt hintereinander geschrieben hat.

Kann mir hier jemand weiterhelfen? Dane für die Hilfe :D

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Programmiersprache?

von Oliver S. (oliverso)


Lesenswert?

Leon schrieb:
> string_ohneleer = string.replace(" ", "")

Hat (vermutlich) zur Folge, daß der Ergebnisstring gar keine Leerzeichen 
mehr enthält. Das ist vermutlich nicht das, was du möchtest.

Leon schrieb:
> Jetzt möchte ich allerdings den string in eine liste umwandeln.

Da gibt es vermutlich auch ein string.split

Oliver

von Imonbln (Gast)


Lesenswert?

Leon schrieb:
> Jetzt möchte ich allerdings den string in eine liste umwandeln.

in welcher Programmiersprache?
falls es Python ist
1
string_list = string.split()

auch bei anderen Sprachen ist eher Split das was du suchen wirst.

von Leon (Gast)


Lesenswert?

Danke für die Antworten. Ja, ich meinte Python. leider konnte ich als 
gast nur einmal Pro Stunde schreiben. Habe jetzt auch selbst schon 
herausgefunden, das es mit .split() funktioniert. auch wenn ich nicht 
weiß warum. weil theoretisch sollte es ja auch an Leerstellen spliten.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Leon schrieb:
> auch wenn ich nicht weiß warum.

Darum:
1
>>> help(str.split)
2
Help on method_descriptor:
3
4
split(self, /, sep=None, maxsplit=-1)
5
    Return a list of the words in the string, using sep as the delimiter string.
6
    
7
    sep
8
      The delimiter according which to split the string.
9
      None (the default value) means split according to any whitespace,
10
      and discard empty strings from the result.
11
    maxsplit
12
      Maximum number of splits to do.
13
      -1 (the default value) means no limit.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Leon schrieb:
> string_ohneleer = string.replace(" ", "")

Hättest nur das Komma als Ersatzzeichen verwenden müssen.
Obwohl ich jetzt Python nicht kann.

string_ohneleer = string.replace(" ", ",")

von STK500-Besitzer (Gast)


Lesenswert?

Heinz B. schrieb:
> Hättest nur das Komma als Ersatzzeichen verwenden müssen.
> Obwohl ich jetzt Python nicht kann.

Dann wäre jedes Leerzeichen durch ein Komma ersetzt worden.
Bringt also gar nichts:
print(string.replace(" ", ","))
Monitor,,,,,,Computer,,,handy

print(Monitor      Computer   handy".split())
['Monitor', 'Computer', 'handy']

Wohlgemerkt ohne explizite Angabe eines Delimiters.

von Werner P. (werner4096)


Lesenswert?

print(string.replace("  ", " "))
print(string.replace(" ", ","))

von Schlaumaier (Gast)


Lesenswert?

string_ohneleer = string.replace(" ", "")  <- entfernt ALLE Leerzeichen

string_ohneleer = string.replace("  ", " ") <- Lässt eins zwischen den 
Wörtern stehen.

string_ohneleer = string.replace("2_leerzeichen", "1 Leerzeichen") <- 
Nur zu Erklärung da man die Leerzeichen nicht sehen kann.

Es ist aber dann erforderlich ein TRIM-Befehl zu machen um ALLE 
Leerzeichen am Anfang und Ende es kompletten String zu entfernen.

Ich vermute als Programmiersprache VB o. VC

von Udo S. (urschmitt)


Lesenswert?

Schlaumaier schrieb:
> Ich vermute als Programmiersprache VB o. VC

Von einem "Schlaumaier" würde ich erwarten dass er einfach die vorigen 
Postings liest!

Leon schrieb:
> Ja, ich meinte Python.

von Schlaumaier (Gast)


Lesenswert?

Udo S. schrieb:
> Von einem "Schlaumaier" würde ich erwarten dass er einfach die vorigen
> Postings liest!

Falsche Erwartung.

Ich lese nicht die üblichen Dummen Sprüche hier. Ich lese den Post des 
TO und gebe darauf meine Antwort.

Davon abgesehen ist meine Antwort eine logische und von der 
Programmiersprache unabhängig. Ergo auch für Python geeignet.

von Udo S. (urschmitt)


Lesenswert?

Schlaumaier schrieb:
> Ich lese nicht die üblichen Dummen Sprüche hier.

Nur das es kein dummer Spruch sondern eine zusätzliche Angabe des TOOs 
war.
Mehr als 2 Stunden vor deinem Post

Schlaumaier schrieb:
> Ich lese den Post des TO und gebe darauf meine Antwort.

Leider eine die völlig am Thema vorbei ist denn du hast nur die Hälfte 
des ersten Posts gelesen:

Leon schrieb:
> Jetzt möchte ich allerdings den string in eine liste umwandeln.

Schlaumaier schrieb:
> Falsche Erwartung.

Bei solchen Posts erwartet man nicht mehr viel.

:-(

von Yalu X. (yalu) (Moderator)


Lesenswert?

Schlaumaier schrieb:
> string_ohneleer = string.replace("  ", " ") <- Lässt eins zwischen den
> Wörtern stehen.

Nein, das macht aus n Leerzeichen ⌊(n+1)/2⌋. Und das Wesentliche fehlt:

Leon schrieb:
> Jetzt möchte ich allerdings den string in eine liste umwandeln.


Schlaumaier schrieb:
> Ich lese nicht die üblichen Dummen Sprüche hier.

Musst du auch nicht. Ich sehe in diesem Thread aber kaum einen dummen
Spruch.

> Ich lese den Post des TO

Davon gibt es aber zwei. Zumindest diese hättest du lesen können.

Edit: Udo war schneller :)

: Bearbeitet durch Moderator
von Schlaumaier (Gast)


Lesenswert?

Leon schrieb:
> Jetzt möchte ich allerdings den string in eine liste umwandeln.

In VB wäre das nicht wirklich ein Problem für mich. Aber in Python weiß 
ich nicht ob es dafür eine Funktion gibt.

In VB würde ich es mit einer Schleife machen und dabei die Funktionen 
MID + INSTR benutzen. Weil ich es andere Funktion auch in VB nicht 
kenne.

Genauer gesagt würde ich  *my_funktion.string_in_array(text$,liste())*
aufrufen, da ich diese Funktion mal geschrieben habe.

Also habe ich diese Teil der Frage zwar gelesen aber nicht beantwortet, 
da ich mir meiner Lösung nicht sicher war. Und kein Interesse daran 
hatte, das ich wegen einer 10-20 Zeilen VB - Lösung wieder von euch 
beschimpft werde.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Zur ersten Aufgabe: ich lasse gelegentlich im Hexeditor alle "20 20" 
durch "20" ersetzen, so oft bis keine mehr gefunden werden. Dann hat man 
nur noch einzelne Leerzeichen.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

STK500-Besitzer schrieb:
> Dann wäre jedes Leerzeichen durch ein Komma ersetzt worden.

Ja, hast Recht. Das habe ich nicht bedacht.
Vielleicht auch mit einem regulären Ausdruck suchen und ersetzen,
falls das in Python möglich ist.

Etwa so : string.replace(" {1,}", ",")

Reguläre Ausdrücke bieten sich förmlich dafür an.

: Bearbeitet durch User
von Schlaumaier (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> Dann wäre jedes Leerzeichen durch ein Komma ersetzt worden.

Die sicherste (und von Excel anerkannte Methode) ist, als Trennzeichen 
ein CHR(9) = TAB einzusetzen, zur Trennung der Felder.

Da dieses Zeichen im normalen Text nicht vorkommt, ein Komma aber schon. 
Ich habe Kommas sogar schon in Adressen gesehen.

von Oliver S. (oliverso)


Lesenswert?

Schlaumaier schrieb:
> Die sicherste (und von Excel anerkannte Methode)

nennt sich csv. Dreimal darfst du raten, warum.

Oliver

von Yalu X. (yalu) (Moderator)


Angehängte Dateien:

Lesenswert?

Schlaumaier schrieb:
> In VB würde ich es mit einer Schleife machen und dabei die Funktionen
> MID + INSTR benutzen. Weil ich es andere Funktion auch in VB nicht
> kenne.
>
> Genauer gesagt würde ich  *my_funktion.string_in_array(text$,liste())*
> aufrufen, da ich diese Funktion mal geschrieben habe.

Warum so unendlich kompliziert, wenn es in Python (das der TE verwenden
will) mit einem einzigen Funktionsuafruf geht?

Schlaumaier schrieb:
> Die sicherste (und von Excel anerkannte Methode) ist, als Trennzeichen
> ein CHR(9) = TAB einzusetzen, zur Trennung der Felder.

Der String des TE enthält nun aber nun mal Leerzeichen zwischen den
Wörtern und das in einer variablen Anzahl. Ganz abgesehen davon kommt
split() auch mit Tabs, Newlines und allen anderen Whitspace-Zeichen
zurecht.

von Schlaumaier (Gast)


Lesenswert?

Oliver S. schrieb:
> nennt sich csv. Dreimal darfst du raten, warum.

k.a.

Aber ich kenne CSV mit komma, Komma + Anführungszeichen, TAB, 
Sonderzeichen und in allen Kombis davon.

Einfach gesagt, es gibt keine Norm.

Nicht einmal CSV ist genormt, weil die Prg. auch SDF + TXT Dateien so 
behandeln.

Und selbst wenn ich die CSV nenne stellen die meisten Programme sich 
nicht gleich ein.

von Schlaumaier (Gast)


Lesenswert?

Yalu X. schrieb:
> Warum so unendlich kompliziert, wenn es in Python (das der TE verwenden
> will) mit einem einzigen Funktionsuafruf geht?

Wie bereits weiter oben erwähnt (andere Leute lesen auch nicht alles) 
habe ich extra mich zu den Thema nicht geäußert weil ich keine 
Listen-Funktionen kenne in VB. Und bei Python sowieso nicht.

von Dirk B. (dirkb2)


Lesenswert?

Oliver S. schrieb:
> nennt sich csv. Dreimal darfst du raten, warum.

Character Seperated Values.

Und Excel arbeitet am Besten mit Tabulatoren.

: Bearbeitet durch User
von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Sagt mal, ihr Python - Experten, ist das denn wirklich so
schwierig ? Weil ich es jetzt wissen wollte, habe ich mir
mal das Python 3.9 installiert.
Nach zehn Minuten googeln hatte ich schon Erfolg.
Da war das Googeln mehr wegen der Syntax angesagt.
1
>>> import re
2
>>> s = "Monitor      Computer   handy"
3
>>> obj = re.sub(r' +', ",", s)
4
>>> print(obj)

Monitor,Computer,handy

: Bearbeitet durch User
von Dirk B. (dirkb2)


Lesenswert?

Heinz B. schrieb:
> Sagt mal, ihr Python - Experten, ist das denn wirklich so
> schwierig ?

Nein, wurde ja bereits gelöst.

> Monitor,Computer,handy

Das ist keine Liste, sondern ein String.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Heinz B. schrieb:
> obj = re.sub(r' +', ",", s)

oder
1
obj = ','.join(s.split())

je nachdem, ob man bei
1
s = "  Monitor      Computer   handy "

lieber

  ",Monitor,Computer,handyi,"

oder

  "Monitor,Computer,handy"

als Ergebnis erhalten möchte.

Das alles ist aber etwas offtopic, da der TE ja eine Liste möchte, und
dafür hat er die einfachste Lösung ja schon selbst gefunden.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Dirk B. schrieb:
> Das ist keine Liste, sondern ein String.

Wenn er das dann schon nicht hin bekommt, soll er am
besten mit Python und überhaupt mit irgendwelchen Programmier
- oder Scriptspachen gar erst nicht anfangen. Einen String
in eine Liste oder Array zu splitten, ist ja wohl erstes
Schuljahr.

Man muß schon etwas Eigeninitiative zeigen. Das ist doch das
schöne am Programmieren, wenn man einen sogen. AHA-Effekt hat.
Das macht doch den Reiz zum Programmieren erst aus. Den Effekt
hatte ich damals (und auch heute noch) sichtlich genossen. Gerade,
so etwas Banales selber lösen zu können, spornt doch auch zum
Weitermachen bzw. Reinwachsen an.

von STK500-Besitzer (Gast)


Lesenswert?

Heinz B. schrieb:
> Wenn er das dann schon nicht hin bekommt, soll er am
> besten mit Python und überhaupt mit irgendwelchen Programmier
> - oder Scriptspachen gar erst nicht anfangen. Einen String
> in eine Liste oder Array zu splitten, ist ja wohl erstes
> Schuljahr.
Da sollte sich jemand mal an die eigene Nase fassen.
Gefordert war eine List, kein csv-String.
Das Problem wurde mit dem ersten Post mit ".split()" schön gelöst.
Man kann es natürlich auch zu Fuß (in Assemlber) erledigen.
In PHP würde man "explode()" verwenden.

> Man muß schon etwas Eigeninitiative zeigen. Das ist doch das
> schöne am Programmieren, wenn man einen sogen. AHA-Effekt hat.
> Das macht doch den Reiz zum Programmieren erst aus. Den Effekt
> hatte ich damals (und auch heute noch) sichtlich genossen. Gerade,
> so etwas Banales selber lösen zu können, spornt doch auch zum
> Weitermachen bzw. Reinwachsen an.
Seine Eigeninitiative war, jemand anders zu fragen. Das halte ich für 
legetim, wenn man "den Wald vor lauter Bäumen nicht sieht".

Woher soll ein Anfänger den Begriff "regulärer Ausdruck" kennen?
Das ist ja noch abstrakter als eine Schleife und ein paar If-Abfragen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.