Entfernen Sie ein Präfix aus einer Zeichenfolge [duplicate]

Lesezeit: 3 Minuten

Ich versuche auf klare pythonische Weise Folgendes zu tun:

def remove_prefix(str, prefix):
    return str.lstrip(prefix)

print remove_prefix('template.extensions', 'template.')

Das gibt:

xtensions

Was ich nicht erwartet hatte (extensions). Offensichtlich (blöde mich), weil ich verwendet habe lstrip falsch: lstrip entfernt alle Zeichen, die in der übergebenen vorkommen chars Zeichenfolge, wobei diese Zeichenfolge nicht als echte Zeichenfolge betrachtet wird, sondern als “eine Gruppe von Zeichen, die am Anfang der Zeichenfolge entfernt werden”.

Gibt es eine Standardmethode zum Entfernen einer Teilzeichenfolge am Anfang einer Zeichenfolge?

  • Verwenden Sie in Python 3.9+ str.removeprefix

    – Boris Werchowskij

    27. April 2020 um 15:48 Uhr

  • Nützliche Funktionen für removeprefix() und removesuffix() im neu veröffentlichten Python 3.9.

    – Milovan Tomašević

    17. Oktober 2020 um 9:55 Uhr

  • Einzeiler aus der Antwort von @martineau: remove_prefix = lambda text, prefix: text[len(prefix):] if text.startswith(prefix) else text

    – Basj

    29. April um 16:47 Uhr


Elazars Benutzeravatar
Elazar

“Standardweg” kenne ich nicht.

def remove_prefix(text, prefix):
    if text.startswith(prefix):
        return text[len(prefix):]
    return text  # or whatever

Wie von @Boris und @Stefan angemerkt, können Sie Python 3.9+ verwenden

text.removeprefix(prefix)

mit dem gleichen Verhalten.

  • Ab in Python 3.9können Sie verwenden removeprefix. Ein Beispiel finden Sie in dieser Antwort.

    – Stefan

    27. Mai 2020 um 18:53 Uhr


  • Kühl! Hinweis: Das Verhalten der neuen Funktion ist genau wie in dieser Antwort (die Zeichenfolge wird unverändert zurückgegeben, wenn sie nicht mit beginnt prefix)

    – Elazar

    27. Mai 2020 um 23:50 Uhr


  • Das ist perfekt zum Trimmen hh:mm:ss führende Nullen, ohne signifikante Nullen zu beschädigen. Führend habe ich ersetzt '0:' und dann '0' zu null. Dies erlauben 10: zusammen mit intakt zu bleiben 5:08.

    – WinEunuuchs2Unix

    18. Oktober 2020 um 2:19 Uhr


  • removeprefix – besser spät als nie.

    – Martinau

    24. Februar 2021 um 21:40 Uhr


  • Und die endswith() parallel ist removesuffix()

    – Josiah Yoder

    29. Juli um 19:12 Uhr

Kurz und bündig:

def remove_prefix(text, prefix):
    return text[text.startswith(prefix) and len(prefix):]

  • @jamylak es ist wie das “ternäre” und-oder, aber richtig 🙂 … +1, obwohl ich denke, dass es für echten Code etwas zu schlau ist. Und Sie können nicht anders entscheiden, dass eine Ausnahme ausgelöst werden soll.

    – Elazar

    3. Juni 2013 um 9:15 Uhr


  • Nun, Sie müssen definitiv viel länger nachdenken, wenn Sie Code wie diesen im Vergleich zur akzeptierten Antwort überprüfen, auch wenn Sie häufiger mit Python arbeiten.

    – Thomas

    13. August 2020 um 14:37 Uhr


  • Abgestimmt. Das ist die Art von unnötigem Schlaukram, der sogar das Lesen von MEINEM EIGENEN CODE erschwert.

    – HerrR

    20. Dezember 2020 um 2:18 Uhr


  • @MrR: Python hat auch ein weiteres, häufig zu wenig genutztes Feature: Kommentare.

    – Martinau

    20. Dezember 2020 um 5:33 Uhr

  • Kommentare laufen Gefahr, sich von dem Code zu lösen, auf den sie sich beziehen, und sind daher weit entfernt von einem Allheilmittel für die Code-Klärung. Ich bevorzuge selbstkommentierenden Code.

    – HerrR

    27. Dezember 2020 um 4:43 Uhr


Was ist damit (etwas spät):

def remove_prefix(s, prefix):
    return s[len(prefix):] if s.startswith(prefix) else s

  • +1 Prägnant. Aber können Sie es schaffen, im Fehlerfall etwas zu erhöhen und es trotzdem in 2 Zeilen x 80 Spalten zu passen?

    – persönliche_cloud

    22. September 2017 um 23:26 Uhr

  • @personal_cloud: return s[s[:len(prefix)].index(prefix) + len(prefix):]

    – William Pursel

    21. Dezember 2017 um 19:21 Uhr

Benutzeravatar von jamylak
jamylak

Regex-Lösung (Der beste Weg ist die Lösung von @Elazar, das ist nur zum Spaß)

import re
def remove_prefix(text, prefix):
    return re.sub(r'^{0}'.format(re.escape(prefix)), '', text)

>>> print remove_prefix('template.extensions', 'template.')
extensions

Ich denke, Sie können Methoden der verwenden str geben Sie dazu ein. Reguläre Ausdrücke sind nicht erforderlich:

def remove_prefix(text, prefix):
    if text.startswith(prefix): # only modify the text if it starts with the prefix
         text = text.replace(prefix, "", 1) # remove one instance of prefix
    return text

  • Bisher die eleganteste Lösung.

    – Mario Wanka

    15. September 2021 um 7:22 Uhr

def remove_prefix(str, prefix):
    if str.startswith(prefix):
        return str[len(prefix):]
    else:
        return str

Als Nebenbemerkung, str ist ein schlechter Name für eine Variable, weil sie die überschattet str Typ.

  • Bisher die eleganteste Lösung.

    – Mario Wanka

    15. September 2021 um 7:22 Uhr

1435920cookie-checkEntfernen Sie ein Präfix aus einer Zeichenfolge [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy