Wie überprüfe ich, ob die Zeichenfolge leer ist?

Lesezeit: 6 Minuten

Wie uberprufe ich ob die Zeichenfolge leer ist
Joan Venge

Hat Python so etwas wie eine leere String-Variable, wo Sie Folgendes tun können:

if myString == string.empty:

Unabhängig davon, was ist der eleganteste Weg, um nach leeren Zeichenfolgenwerten zu suchen? Ich finde Hardcoding "" jedes Mal zum Überprüfen einer leeren Zeichenfolge nicht so gut.

  • Wie ist "" nicht so gut?

    – Kein Name

    8. Februar 20 um 23:19 Uhr

Wie uberprufe ich ob die Zeichenfolge leer ist
Andreas Clark

Leere Strings sind “falsch” (Python 2 oder Python 3 Referenz), was bedeutet, dass sie in einem booleschen Kontext als falsch betrachtet werden, also können Sie einfach Folgendes tun:

if not myString:

Dies ist der bevorzugte Weg, wenn Sie wissen, dass Ihre Variable ein String ist. Wenn Ihre Variable auch einen anderen Typ haben könnte, sollten Sie verwenden myString == "". Siehe die Dokumentation auf Wahrheitswertprüfung für andere Werte, die in booleschen Kontexten falsch sind.

  • Seien Sie vorsichtig, da auch viele andere Dinge falsch sind.

    – Ignacio Vazquez-Abrams

    5. März 12 um 20:11 Uhr

  • Ich habe noch nie von dem Begriff falsch gehört. Bedeutet es, dass es falsch zurückgibt?

    – Joan Venge

    5. März 12 um 20:15 Uhr

  • @Joan: Es wird in einem booleschen Kontext als falsch ausgewertet.

    – Ignacio Vazquez-Abrams

    5. März 12 um 20:16 Uhr

  • OP möchte wissen, ob die Variable eine leere Zeichenfolge ist, aber Sie würden auch die eingeben if not myString: blockieren, wenn myString war None, 0, False usw. Wenn Sie sich also nicht sicher sind, welcher Typ myString ist, sollten Sie verwenden if myString == "": um festzustellen, ob es sich um eine leere Zeichenfolge im Gegensatz zu einem anderen falschen Wert handelt.

    – Andreas Clark

    7. August 13 um 16:08 Uhr

  • @AndrewClark, für einen solchen Fall anstelle einer Kette von if myString == ... Ausdrücke, die wir verwenden könnten if myString in (None, '') oder per @Bartek, if myString in (None, '') or not myString.strip()

    – Eintopf

    12. Juni 15 um 19:43 Uhr


1644285487 162 Wie uberprufe ich ob die Zeichenfolge leer ist
zenpoy

Von PEP 8, in dem Abschnitt „Programmierempfehlungen“.:

Verwenden Sie für Sequenzen (Strings, Listen, Tupel) die Tatsache, dass leere Sequenzen falsch sind.

Sie sollten also verwenden:

if not some_string:

oder:

if some_string:

Nur zur Verdeutlichung, Sequenzen sind ausgewertet zu False oder True in einem booleschen Kontext, ob sie leer sind oder nicht. Sie sind nicht gleich zu False oder True.

  • PS: Zur Verteidigung des PEP könnte man argumentieren, dass “x ist falsch” (Kleinbuchstaben falsch) bedeutet bereits das, anstatt Bedeutung x == False. Aber IMHO ist die Klarstellung angesichts der Zielgruppe immer noch willkommen.

    – MestreLion

    12. März 16 um 16:24 Uhr


1644285488 835 Wie uberprufe ich ob die Zeichenfolge leer ist
Bartek

Der eleganteste Weg wäre wahrscheinlich, einfach zu prüfen, ob es wahr oder falsch ist, z.

if not my_string:

Möglicherweise möchten Sie jedoch Leerzeichen entfernen, weil:

 >>> bool("")
 False
 >>> bool("   ")
 True
 >>> bool("   ".strip())
 False

Sie sollten dies jedoch wahrscheinlich etwas expliziter machen, es sei denn, Sie wissen sicher, dass diese Zeichenfolge eine Art Validierung bestanden hat und eine Zeichenfolge ist, die auf diese Weise getestet werden kann.

1644285488 383 Wie uberprufe ich ob die Zeichenfolge leer ist
Rubel

Ich würde das Nichts vor dem Strippen testen. Außerdem würde ich die Tatsache nutzen, dass leere Zeichenfolgen False (oder Falsy) sind. Dieser Ansatz ist ähnlich wie Apaches StringUtils.isBlank oder Guavas Strings.isNullOrEmpty

Dies ist, was ich verwenden würde, um zu testen, ob eine Zeichenfolge entweder None ODER Empty OR Blank ist:

def isBlank (myString):
    if myString and myString.strip():
        #myString is not None AND myString is not empty or blank
        return False
    #myString is None OR myString is empty or blank
    return True

Und das genaue Gegenteil zum Testen, ob eine Zeichenfolge nicht None NOR Empty NOR Blank ist:

def isNotBlank (myString):
    if myString and myString.strip():
        #myString is not None AND myString is not empty or blank
        return True
    #myString is None OR myString is empty or blank
    return False

Kürzere Formen des obigen Codes:

def isBlank (myString):
    return not (myString and myString.strip())

def isNotBlank (myString):
    return bool(myString and myString.strip())

1644285489 102 Wie uberprufe ich ob die Zeichenfolge leer ist
Gewölbe

Ich habe einmal etwas Ähnliches wie Barteks Antwort geschrieben und von Javascript inspiriert:

def is_not_blank(s):
    return bool(s and not s.isspace())

Prüfen:

print is_not_blank("")    # False
print is_not_blank("   ") # False
print is_not_blank("ok")  # True
print is_not_blank(None)  # False

  • Warum nicht einfach return bool(s.strip())

    – anilbey

    3. März 20 um 9:23 Uhr

  • AttributeError: 'NoneType' object has no attribute 'strip'

    – Gewölbe

    3. März 20 um 13:04 Uhr

  • s.strip() weist einen neuen String zu, was reine Verschwendung ist. Benutzen string.isspace()

    – Clemens

    22. Juni 2020 um 15:27 Uhr

  • "".isspace() ist False

    – Danon

    17. Juni 21 um 13:57 Uhr

  • @ Danon wird den ersten Test nicht bestehen s and und wird kurzschließen.

    – Alexander Suraphel

    18. November 21 um 13:07 Uhr

1644285489 795 Wie uberprufe ich ob die Zeichenfolge leer ist
Dakkaron

Der einzige wirklich solide Weg, dies zu tun, ist der folgende:

if "".__eq__(myString):

Alle anderen Lösungen haben mögliche Probleme und Grenzfälle, in denen die Prüfung fehlschlagen kann.

len(myString)==0 kann scheitern, wenn myString ist ein Objekt einer Klasse, die erbt von str und überschreibt die __len__() Methode.

Ähnlich myString == "" und myString.__eq__("") kann scheitern, wenn myString überschreibt __eq__() und __ne__().

Aus irgendeinem Grund "" == myString wird auch getäuscht, wenn myString überschreibt __eq__().

myString is "" und "" is myString sind gleichwertig. Sie werden beide scheitern, wenn myString ist eigentlich keine Zeichenfolge, sondern eine Unterklasse von Zeichenfolge (beide werden zurückgegeben False). Da es sich um Identitätsprüfungen handelt, funktionieren sie nur deshalb, weil Python String Pooling (auch als String Internment bezeichnet) verwendet, das dieselbe Instanz eines Strings verwendet, wenn es interniert ist (siehe hier: Warum funktioniert der Vergleich von Strings entweder mit ‘= =’ oder ‘ist’ führen manchmal zu einem anderen Ergebnis?). Und "" ist von Anfang an in CPython interniert

Das große Problem bei der Identitätsprüfung ist, dass String Internment (soweit ich das feststellen konnte) nicht standardisiert ist, welche Strings interniert werden. Das heißt, theoretisch "" ist nicht notwendigerweise interniert und das ist implementierungsabhängig.

Die einzige Möglichkeit, dies wirklich nicht zu täuschen, ist die eingangs erwähnte: "".__eq__(myString). Da dies explizit die ruft __eq__() Methode des leeren Strings kann nicht durch Überschreiben von Methoden in myString getäuscht werden und arbeitet solide mit Unterklassen von str.

Auch das Verlassen auf die Falschheit einer Zeichenfolge funktioniert möglicherweise nicht, wenn das Objekt sie überschreibt __bool__() Methode.

Dies ist nicht nur theoretische Arbeit, sondern könnte tatsächlich in der realen Verwendung relevant sein, da ich gesehen habe, wie Frameworks und Bibliotheken Unterklassen erstellt haben str vor und Verwendung myString is "" könnte dort eine falsche Ausgabe zurückgeben.

Auch das Vergleichen von Zeichenfolgen mit is Im Allgemeinen ist es eine ziemlich böse Falle, da es manchmal richtig funktioniert, aber manchmal nicht, da das String-Pooling ziemlich seltsamen Regeln folgt.

In den meisten Fällen funktionieren jedoch alle genannten Lösungen ordnungsgemäß. Dieser Beitrag ist hauptsächlich akademische Arbeit.

  • Warum nicht einfach return bool(s.strip())

    – anilbey

    3. März 20 um 9:23 Uhr

  • AttributeError: 'NoneType' object has no attribute 'strip'

    – Gewölbe

    3. März 20 um 13:04 Uhr

  • s.strip() weist einen neuen String zu, was reine Verschwendung ist. Benutzen string.isspace()

    – Clemens

    22. Juni 2020 um 15:27 Uhr

  • "".isspace() ist False

    – Danon

    17. Juni 21 um 13:57 Uhr

  • @ Danon wird den ersten Test nicht bestehen s and und wird kurzschließen.

    – Alexander Suraphel

    18. November 21 um 13:07 Uhr

1644285490 400 Wie uberprufe ich ob die Zeichenfolge leer ist
hostingutilities.com

Leeren oder leeren String testen (kürzerer Weg):

if myString.strip():
    print("it's not an empty or blank string")
else:
    print("it's an empty or blank string")

  • Wenn myString = None, wird eine Ausnahme ausgelöst. Verwenden Sie besser die Antwort von @vault

    – Dominik

    29. Oktober 16 um 12:39 Uhr


  • @Dominik wenn myString isinstance(myString, int) wird auch eine Ausnahme auslösen. Worum geht es dir? Das OP fragte nach Möglichkeiten zum Testen leerer Zeichenfolgen, seine Frage beinhaltet keine Typprüfung.

    – Hammermann6006

    17. Dezember 21 um 12:12 Uhr

.

816940cookie-checkWie überprüfe ich, ob die Zeichenfolge leer ist?

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

Privacy policy