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.
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:
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
:
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:
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.
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%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%Tags und Links python