Slice eine Zeichenfolge nach einer bestimmten Phrase?

8

Ich habe eine Menge von Saiten, die ich reduzieren muss. Sie sind im Grunde ein Deskriptor gefolgt von Codes. Ich möchte nur den Deskriptor behalten.

%Vor%

Die obigen Codes sind dps , 23 und fd . Sie können in beliebiger Reihenfolge auftreten, stehen nicht miteinander in Beziehung und existieren möglicherweise gar nicht (wie im letzten Fall).

Die Liste der Codes ist fest (oder kann zumindest vorhergesagt werden), also unter der Annahme, dass ein Code niemals in einem legitimen Deskriptor verwendet wird, wie kann ich alles nach der ersten Instanz eines Codes entfernen.

Ich benutze Python.

    
Oli 27.10.2009, 22:03
quelle

5 Antworten

21

Die kurze Antwort, wie @ THC4K in einem Kommentar sagt:

%Vor%

Dabei ist string der ursprüngliche String, pattern ist dein "break" -Muster, 1 zeigt an, dass nicht mehr als 1 Mal geteilt wird und [0] bedeutet, dass das erste von split zurückgegebene Element genommen wird.

In Aktion:

%Vor%

Dies ist eine viel kürzere Art, etwas auszudrücken, was ich vorher geschrieben habe, was ich trotzdem hier behalten werde.

Und wenn Sie mehrere Muster entfernen müssen, ist dies ein großartiger Kandidat für das reduce builtin:

%Vor%

Das sagt im Grunde: für jeden pat in patterns : nimm string und wiederhole string.split(pat, 1)[0] (wie oben erklärt), wobei jedes Mal das Ergebnis des zuvor zurückgegebenen Wertes bearbeitet wird. Wie Sie sehen können, wenn keines der Muster in der Zeichenfolge ist, wird die ursprüngliche Zeichenfolge immer noch zurückgegeben.

Die einfachste Antwort ist ein Listen- / String-Slice kombiniert mit einem string.find :

%Vor%

Ein besserer Ansatz (um zu vermeiden, dass das letzte Zeichen in einem fehlenden Muster abgeschnitten wird, wenn s.find -1 zurückgibt) könnte darin bestehen, eine einfache Funktion zu verwenden:

%Vor%

Die Syntax [:s.find(x)] nimmt den Teil der Zeichenkette vom Index 0 bis zur rechten Seite des Doppelpunkts; und in diesem Fall ist das RHS das Ergebnis von s.find , das den Index der übergebenen Zeichenfolge zurückgibt.

    
Mark Rushakoff 27.10.2009, 22:21
quelle
2

Sie scheinen so etwas zu beschreiben:

%Vor%

z. B.

%Vor%     
Ryan Bright 27.10.2009 22:30
quelle
1
%Vor%     
steveha 27.10.2009 23:31
quelle
1

Ich würde wahrscheinlich einen regulären Ausdruck dafür verwenden:

%Vor%

Es war mir nicht ganz klar, ob Sie wollen, was Sie extrahieren, um Text zu enthalten, der den Deskriptoren vorausgeht, oder wenn Sie erwarten, dass jede Textzeile mit einem Deskriptor beginnt; das oben Gesagte beschäftigt sich mit letzterem. Für den ersten Fall ändern Sie einfach das Muster, um alle Zeichen vor dem ersten Auftreten eines Deskriptors zu erfassen:

%Vor%     
Robert Rossney 28.10.2009 00:25
quelle
0

Hier ist eine Antwort, die für alle Codes funktioniert, anstatt Sie zu zwingen, die Funktion für jeden Code aufzurufen, und ist ein bisschen einfacher als einige der obigen Antworten. Es funktioniert auch für alle Ihre Beispiele.

%Vor%

Ausgabe:

%Vor%

Ich glaube, dass dies alle Ihre Kriterien erfüllt.

Edit: Ich habe schnell gemerkt, dass Sie den try catch entfernen können, wenn Sie die Ausnahme nicht erwarten möchten:

%Vor%     
Brent Newey 28.10.2009 13:59
quelle

Tags und Links