String kürzen (bei unbekannter Teil-Länge)

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
jake-the-snake

Mittwoch 17. Januar 2018, 10:22

Morgen Forum

Ich habe wieder mal eine Frage bezüglich eines Strings / einer Zeichenkette.
Angenommen eine beliebige Zeichenkette sieht so aus:

Code: Alles auswählen

cryptocode = ~30240A74288~30240A74310~30240D74290~30240E74327~30240J74325
Im Beispiel also 5 Blockwerte.

Wie kann ich beispielsweise die letzten beiden Blöcke "~30240E74327" und "~30240J74325" abschneiden, wenn der Zwischenraum bei den Würmchen "~" variieren kann? Also mal so "~30240E74327~" oder so "~340E7427~" ist? Stupides von hinten abzählen ist also nicht möglich. Die Grenzen der Blöcke werden durch das Würmchen-Zeichen gesetzt.

Das Dumme ist, das ich im Programm sagen können muss: Schneid mir die letzten 2 Blöcke ab, schneide die letzten 4 Blöcke ab usw...
Ich kenne "split", aber ich will ja nur die letzten Blöcke "splitten" und entfernen - nicht alle...

Wie gehe ich da am besten ran?

Gruss jts
Benutzeravatar
/me
User
Beiträge: 3204
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mittwoch 17. Januar 2018, 10:33

Ansatz 1: Du baust eine Schleife die von hinten so lange zählt, bis sie die gewünschte Anzahl an Trennzeichen gefunden hat. Danach nimmst du aus dem String von links nur den Bereich, der bis zur Position des ermittelten Trennzeichen geht.
Ansatz 2: Du nimmst split und baust den String hinterher wieder mit join zusammen wobei du die letzten n Elemente wegfallen lässt.
jake-the-snake

Mittwoch 17. Januar 2018, 10:42

Hallo /me

Hey, vielen Dank. Der 1. Ansatz gefällt mir.
Werde eine Schleife Position für Position (von hinten gezählt) so lange laufen lassen, bis die gewünschte Anzahl an Trennwürmchen gefunden wurde.
Gleichzeitig muss ich ja dann wohl auch einen Zählerwert laufen lassen, aus dem ich die Anzahl der von hinten gezählten Positionen entnehmen kann.
Dieser Zählerwert dient dann zum Abschneiden des Stringendes. Klasse Idee!

Werde mich mal gleich dran setzen.

Vielen herzlichen Dank für deine Hilfe

Gruss jts
Benutzeravatar
/me
User
Beiträge: 3204
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mittwoch 17. Januar 2018, 10:45

jake-the-snake hat geschrieben:Der 1. Ansatz gefällt mir.
Dann setz den mal um.

Für Variante 2 habe ich spontan folgenden Code geschrieben

Code: Alles auswählen

def remove_parts_from_end(text, no_of_parts, delimiter='~'):
    return delimiter.join(text.split(delimiter)[:-no_of_parts])
Das arbeitet in der aktuellen Form nur etwas unerwartet wenn man 0 für die Anzahl der abzuschneidenden Teile angibt.
Sirius3
User
Beiträge: 8437
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 17. Januar 2018, 11:17

@jake-the-snake: dafür kennt `split`, bzw. `rsplit` ein weiteres Argument:

Code: Alles auswählen

cryptocode = "~30240A74288~30240A74310~30240D74290~30240E74327~30240J74325"
cryptocode = cryptocode.rsplit("~", 2)[0]
Benutzeravatar
/me
User
Beiträge: 3204
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mittwoch 17. Januar 2018, 13:14

rsplit ist natürlich die intelligentere Variante. :oops:
Zu meiner Verteidigung: die Kaffeemaschine in der Firma hatte einen Defekt.
jake-the-snake

Mittwoch 17. Januar 2018, 13:43

Hallo zusammen

Tja, das ist die Strafe, wenn man zu spät ins Forum schaut. Ich habe, nach dem ich verspätet rein gesehen habe, mein riesen Overhead an Schleifen-Konstrukt in die Tonne getreten, und statt dessen von Sirius3, den berühmten "rsplit" genommen :lol:

Dennoch Dank an alle.

Eine Zusatzfrage an Sirius3 hätte ich aber:

Ich konnte in keiner Dokumentation deine Zusatzoption "[0]" finden.
Trenner "~" ist klar.
Wie oft getrennt wird ", 2" ist auch klar.
Nur eben die eckige Klammer am Ende würde mich interessieren. Ohne geht's jedenfalls nicht (Hab ich testweise ausprobiert).

Grüsse jts
Sirius3
User
Beiträge: 8437
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 17. Januar 2018, 14:29

@jake-the-snake: split liefert eine Liste als Ergebnis.
Antworten