Wie erhalte ich einen Teilstring eines Strings in Python?

2144

Gibt es eine Möglichkeit, eine Zeichenfolge in Python zu unterzeichnen, um eine neue Zeichenfolge vom dritten Zeichen bis zum Ende der Zeichenfolge abzurufen?

Vielleicht wie myString[2:end]?

Wenn das Verlassen des zweiten Teils "bis zum Ende" bedeutet und wenn Sie den ersten Teil verlassen, beginnt er von vorne?

Joan Venge
quelle
1
Dieser enthält eine klare Erklärung pythoncentral.io/cutting-and-slicing-strings-in-python
mario ruiz

Antworten:

3178
>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'

Python nennt dieses Konzept "Slicing" und es funktioniert nicht nur mit Strings. Werfen Sie einen Blick hier für eine umfassende Einführung.

Paolo Bergantino
quelle
401

Nur der Vollständigkeit halber, wie es noch niemand erwähnt hat. Der dritte Parameter für ein Array-Slice ist ein Schritt. Das Umkehren einer Zeichenfolge ist also so einfach wie:

some_string[::-1]

Oder Sie wählen alternative Zeichen aus:

"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"

Die Fähigkeit, vorwärts und rückwärts durch die Zeichenfolge zu gehen, gewährleistet die Konsistenz mit der Möglichkeit, Slice von Anfang oder Ende anzuordnen.

Endophage
quelle
21
@mtahmed absolut verwandt mit Frage. Was ist, wenn Sie eine Teilzeichenfolge erstellen möchten, indem Sie alternative Zeichen aus der Zeichenfolge auswählen? Das wäre my_string [:: 2]
Endophage
Ich denke, es ist wahrscheinlicher, dass Sie den dritten Parameter zum Schneiden erwähnen wollten. Die Notwendigkeit, jedes andere Zeichen aus einer Zeichenfolge abzurufen, mag irgendwo ein wichtiger Anwendungsfall sein, aber ich musste es nie tun. Nicht, dass irgendetwas falsch daran ist, zeigen zu wollen, was Sie wissen - was bringt es, Dinge zu wissen, wenn Sie das nicht können? :) Aber der Fall für die Relevanz für die Frage ist überbewertet.
John Lockwood
1
Sicher, das spezifische Beispiel für die Auswahl alternativer Zeichen ist für die Frage möglicherweise nicht relevant, aber es ist relevant zu verstehen, dass es einen dritten Parameter für das Schneiden gibt, und die einfachen Beispiele dienen dazu, die Funktionsweise zu veranschaulichen. Die Python-Community hat auch eine großartige Geschichte darin, neue Mitglieder auf freundliche Weise zu erziehen :-)
Endophage
127

Substr () funktioniert normalerweise (dh PHP und Perl) folgendermaßen:

s = Substr(s, beginning, LENGTH)

Die Parameter sind also beginningund LENGTH.

Aber Pythons Verhalten ist anders; es erwartet Anfang und eins nach ENDE (!). Dies ist für Anfänger schwer zu erkennen. Der richtige Ersatz für Substr (s, Anfang, LÄNGE) ist also

s = s[ beginning : beginning + LENGTH]
Michał Leon
quelle
76
Die Anfänger sollten die pythonische Art lernen, wenn sie zu Python wechseln, und sich nicht an andere Sprachgewohnheiten halten
Nicu Surdu
3
Der Vollständigkeit halber ist Java insofern wie Python, als die String.substring () -Methode Start und One-Past-End verwendet. Dieser hat mich nur hart gebissen, ich hatte angenommen, dass er wie jede andere Teilzeichenfolgenfunktion auf der Welt lang ist.
PhilHibbs
4
Ein (wahrscheinlich) pythonischerer Weg, dies zu tun, ists[beginning:][:length]
victortv
2
Als jemand, der mit Python anstelle von [Schimpfwort] -Sprachen wie PHP begann, denke ich, dass Python mit seiner Zeichenfolge [Anfang: Ende] viel einfacher und intuitiver ist. Die Länge ist im Allgemeinen nicht relevant.
Gloweye
60

Ein üblicher Weg, um dies zu erreichen, ist das Schneiden von Schnüren.

MyString[a:b] gibt Ihnen einen Teilstring von Index a bis (b - 1).

Codingscientist
quelle
23

Ein Beispiel scheint hier zu fehlen: vollständige (flache) Kopie.

>>> x = "Hello World!"
>>> x
'Hello World!'
>>> x[:]
'Hello World!'
>>> x==x[:]
True
>>>

Dies ist eine gebräuchliche Redewendung zum Erstellen einer Kopie von Sequenztypen (nicht von internierten Zeichenfolgen) [:]. Flach kopiert eine Liste, siehe Python-Listen-Slice-Syntax, die ohne ersichtlichen Grund verwendet wird .

gimel
quelle
12
Dies hat fast nichts mit der Frage nach der Teilzeichenfolge zu tun. Gilt nicht einmal für Zeichenfolgen. StringA = stringB zu sagen ist genug ...
Nicu Surdu
2
Die vollständige Kopie [:] erstellt eine NEUE KOPIE, verwendet die Slice-Syntax und wird als "Teilzeichenfolge von Anfang bis Ende" gelesen
gimel
2
Was bringt es, wenn Strings unveränderlich sind? a=bsollte ausreichen.
Bfontaine
1
@gimel: Eigentlich macht [:]auf einem unveränderlichen Typ überhaupt keine Kopie. Während mysequence[:]meist harmlos ist , wenn mysequenceein unveränderlicher Typ wie ist str, tuple, bytes(PY3) oder unicode(Py2) a = b[:]entspricht a = b, es verschwendet nur eine wenig Zeit den Slicing - Byte - Codes Dispatching zu dem das Objekt reagiert , indem er selbst der sinnlos flache Kopie , da er zurückkehrt , wenn Abgesehen von Objektidentitätstests ist es gleichbedeutend, nur einen weiteren Verweis auf das unveränderliche Selbst zurückzugeben.
ShadowRanger
3
Der Versuch, die anderen Kritikpunkte dieser Antwort zusammenzufassen: In Python sind Zeichenfolgen unveränderlich, daher gibt es keinen Grund, eine Kopie einer Zeichenfolge zu erstellen. Erstellen Sie also s[:]überhaupt keine Kopie : s = 'abc'; s0 = s[:]; assert s is s0. Ja, es war die idiomatische Methode, eine Liste in Python zu kopieren, bis Listen verfügbar sind list.copy, aber ein vollständiges Segment eines unveränderlichen Typs hat keinen Grund, eine Kopie zu erstellen, da es nicht geändert werden kann. Daher kann es auch nur eine im Speicher und geben Wir sollten keine Zeit damit verschwenden, es zu kopieren. Da diese Antwort falsch ist und die Frage nicht einmal beantwortet - sollte sie gelöscht werden?
Aaron Hall
18

Gibt es eine Möglichkeit, eine Zeichenfolge in Python zu unterzeichnen, um eine neue Zeichenfolge vom 3. Zeichen bis zum Ende der Zeichenfolge abzurufen?

Vielleicht wie myString[2:end]?

Ja, dies funktioniert tatsächlich, wenn Sie den Namen einem konstanten Singleton zuweisen oder binden :endNone

>>> end = None
>>> myString = '1234567890'
>>> myString[2:end]
'34567890'

Die Slice-Notation hat 3 wichtige Argumente:

  • Start
  • halt
  • Schritt

Ihre Standardeinstellungen sind, wenn sie nicht angegeben sind None - aber wir können sie explizit übergeben:

>>> stop = step = None
>>> start = 2
>>> myString[start:stop:step]
'34567890'

Wenn das Verlassen des zweiten Teils "bis zum Ende" bedeutet, wenn Sie den ersten Teil verlassen, beginnt er von vorne?

Ja zum Beispiel:

>>> start = None
>>> stop = 2
>>> myString[start:stop:step]
'12'

Beachten Sie, dass wir Start in das Slice aufnehmen, aber nur bis zum Stopp und nicht bis zum Stopp.

Wenn Schritt ist None, wird standardmäßig das Slice 1für den Schritt verwendet. Wenn Sie mit einer negativen Ganzzahl arbeiten, ist Python intelligent genug, um vom Ende zum Anfang zu gelangen.

>>> myString[::-1]
'0987654321'

Ich erkläre die Slice-Notation in meiner Antwort auf die Frage zur Erläuterung der Slice-Notation ausführlich .

Aaron Hall
quelle
8

Sie haben es genau dort, bis auf "Ende". Es heißt Slice-Notation. Ihr Beispiel sollte lauten:

new_sub_string = myString[2:]

Wenn Sie den zweiten Parameter weglassen, ist dies implizit das Ende der Zeichenfolge.

Bouvard
quelle
6

Ich möchte der Diskussion zwei Punkte hinzufügen:

  1. Sie können Nonestattdessen auf einem leeren Feld "von Anfang an" oder "bis zum Ende" angeben:

    'abcde'[2:None] == 'abcde'[2:] == 'cde'

    Dies ist besonders hilfreich bei Funktionen, bei denen Sie kein leeres Leerzeichen als Argument angeben können:

    def substring(s, start, end):
        """Remove `start` characters from the beginning and `end` 
        characters from the end of string `s`.
    
        Examples
        --------
        >>> substring('abcde', 0, 3)
        'abc'
        >>> substring('abcde', 1, None)
        'bcde'
        """
        return s[start:end]
  2. Python hat Slice- Objekte:

    idx = slice(2, None)
    'abcde'[idx] == 'abcde'[2:] == 'cde'
ostrokach
quelle
6

Wenn myString eine Kontonummer enthält, die bei Offset 6 beginnt und die Länge 9 hat, können Sie die Kontonummer folgendermaßen extrahieren : acct = myString[6:][:9].

Wenn das OP dies akzeptiert, möchten sie möglicherweise experimentell versuchen,

myString[2:][:999999]

Es funktioniert - es wird kein Fehler ausgelöst und es tritt kein Standard-String-Padding auf.

CopyPasteIt
quelle
1
Ich denke, wenn Sie diese Methode myString[offset:][:length]im Fall von OP verwenden myString[offset:][:]
möchten,
1
@ VictorVal Die Antwort ist für diejenigen (wie ich), die Python als 2. (3., 4., ...) Programmiersprache gelernt haben und einige bekannte 'Syntax-Hooks' benötigen, um sich der Sprache zu nähern. Jeder Experte in der Sprache wird meine Antwort höchstwahrscheinlich als etwas albern ansehen.
CopyPasteIt
Sollten solche Antworten zum Löschen markiert werden? Andere Antworten erklären eine ähnliche Lösung viel besser, und als ich diese sah, kratzte ich mich ein paar Minuten am Kopf und suchte nach Python, bevor mir klar wurde, dass es sich nur um eine solche Antwort handelt.
Sebi
3

Vielleicht habe ich es verpasst, aber ich konnte auf dieser Seite keine vollständige Antwort auf die ursprüngliche (n) Frage (n) finden, da Variablen hier nicht weiter behandelt werden. Also musste ich weiter suchen.

Da ich noch keinen Kommentar abgeben darf, möchte ich hier meine Schlussfolgerung hinzufügen. Ich bin sicher, ich war nicht der einzige, der daran interessiert war, als ich auf diese Seite zugegriffen habe:

 >>>myString = 'Hello World'
 >>>end = 5

 >>>myString[2:end]
 'llo'

Wenn Sie den ersten Teil verlassen, erhalten Sie

 >>>myString[:end]
 'Hello' 

Und wenn Sie das: auch in der Mitte gelassen haben, haben Sie den einfachsten Teilstring, der das 5. Zeichen wäre (Zählung beginnend mit 0, also in diesem Fall das Leerzeichen):

 >>>myString[end]
 ' '
Rudi Uhl
quelle
1

Nun, ich hatte eine Situation, in der ich ein PHP-Skript in Python übersetzen musste, und es hatte viele Verwendungsmöglichkeiten substr(string, beginning, LENGTH).
Wenn ich mich für Pythons entschieden string[beginning:end]hätte, müsste ich viele Endindizes berechnen. Der einfachere Weg war also string[beginning:][:length], mir viel Ärger zu ersparen.

Edson Horacio Junior
quelle
0

Die Verwendung von fest codierten Indizes selbst kann ein Chaos sein.

Um dies zu vermeiden, bietet Python ein integriertes Objekt an slice().

string = "my company has 1000$ on profit, but I lost 500$ gambling."

Wenn wir wissen wollen, wie viel Geld ich noch habe.

Normale Lösung:

final = int(string[15:19]) - int(string[43:46])
print(final)
>>>500

Scheiben verwenden:

EARNINGS = slice(15, 19)
LOSSES = slice(43, 46)
final = int(string[EARNINGS]) - int(string[LOSSES])
print(final)
>>>500

Mit Slice erhalten Sie Lesbarkeit.

levi
quelle
5
Vielleicht ist dies nicht das beste Beispiel, da die fest codierten Indizes erhalten bleiben und die Lesbarkeit von Zwischenvariablen herrührt, die Sie im ersten Beispiel hätten verwenden können.
ASalazar