Come posso ottenere una sottostringa di una stringa in Python?


Risposte:


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

Python chiama questo concetto "slicing" e funziona su più di semplici stringhe. Dai un'occhiata qui per un'introduzione completa.


401

Solo per completezza come nessun altro ha menzionato. Il terzo parametro di una sezione di array è un passaggio. Quindi invertire una stringa è semplice come:

some_string[::-1]

O la selezione di caratteri alternativi sarebbe:

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

La possibilità di spostarsi avanti e indietro nella stringa mantiene la coerenza con la possibilità di disporre la sezione dall'inizio o alla fine.


21
@mtahmed è assolutamente correlato alla domanda. Cosa succede se si desidera eseguire la sottostringa selezionando i caratteri alternativi dalla stringa? Quello sarebbe my_string [:: 2]
Endofago

Penso che sia più probabile che tu abbia voluto citare il terzo parametro da tagliare. La necessità di ottenere qualsiasi altro carattere da una stringa può essere un caso d'uso importante da qualche parte, ma non ho mai dovuto farlo. Non che ci sia qualcosa di sbagliato nel voler mostrare ciò che sai: qual è il punto di sapere le cose se non puoi farlo. :) Ma il caso di pertinenza della domanda è sopravvalutato.
John Lockwood,

1
Certo, l'esempio specifico di selezione di caratteri alternativi potrebbe non essere rilevante per la domanda, ma capire che esiste un terzo parametro per tagliare molto è rilevante e i semplici esempi servono per illustrare come funziona. La community di Python ha anche una grande storia di educazione dei nuovi membri in modo amichevole :-)
Endofago

127

Substr () normalmente (cioè PHP e Perl) funziona in questo modo:

s = Substr(s, beginning, LENGTH)

Quindi i parametri sono beginninge LENGTH.

Ma il comportamento di Python è diverso; si aspetta l'inizio e uno dopo END (!). Questo è difficile da individuare per i principianti. Quindi la sostituzione corretta per Substr (s, inizio, LUNGHEZZA) è

s = s[ beginning : beginning + LENGTH]

76
I principianti dovrebbero imparare il modo pitonico quando si spostano su Python, non attenersi ad altre abitudini linguistiche
Nicu Surdu,

3
E solo per completezza, Java è come Python in quanto il metodo String.substring () prende inizio e fine. Questo mi ha appena morso, avevo pensato che fosse lunghezza come ogni altra funzione di sottostringa al mondo.
PhilHibbs,

4
Un modo (probabilmente) più pitonico per farlo ès[beginning:][:length]
victortv,

2
Come qualcuno che ha iniziato con Python invece di lingue sporche come PHP, penso che Python sia molto più semplice e intuitivo con la sua stringa [inizio: fine]. La lunghezza generalmente non è rilevante.
Gloweye,

60

Un modo comune per raggiungere questo obiettivo è affettare le stringhe.

MyString[a:b] ti dà una sottostringa dall'indice a a (b - 1).


23

Qui sembra mancare un esempio: copia completa (superficiale).

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

Si tratta di un linguaggio comune per la creazione di una copia di tipi di sequenze (non di stringhe internati), [:]. Shallow copia un elenco, vedi la sintassi della slice dell'elenco Python utilizzata senza motivo ovvio .


12
Questo non ha quasi nulla a che fare con la domanda sulla sottostringa. Non si applica nemmeno alla stringa. Dire stringaA = stringaB è sufficiente ...
Nicu Surdu,

2
La copia completa [:] crea una NUOVA COPIA, usa la sintassi della fetta e viene letta come "sottostringa dall'inizio alla fine"
gimel

2
Qual è il punto poiché le stringhe sono immutabili? a=bdovrebbe essere sufficiente.
bfontaine,

1
@gimel: In realtà, [:]su un tipo immutabile non ne fa affatto una copia. Mentre mysequence[:]è per lo più innocui se mysequenceè un tipo immutabile, come str, tuple, bytes(PY3) o unicode(PY2), a = b[:]è equivalente a a = b, solo spreca un po 'di tempo della spedizione dei codici di byte affettatrici che le risponde oggetto di se stesso il ritorno in quanto è inutile copia superficiale quando , a parte i test di identità degli oggetti, equivale a restituire un altro riferimento al proprio io immutabile.
ShadowRanger,

3
Cercando di riassumere le altre critiche di questa risposta: In Python, le stringhe sono immutabili, quindi non c'è alcun motivo per fare una copia di una stringa - in modo da s[:]non fare una copia a tutti: s = 'abc'; s0 = s[:]; assert s is s0. Sì, era il modo idiomatico di copiare un elenco in Python fino a quando non ne sono arrivati ​​gli elenchi list.copy, ma una porzione completa di un tipo immutabile non ha motivo di fare una copia perché non può essere cambiata, quindi potrebbe essercene anche solo uno in memoria e non dovremmo perdere tempo a copiarlo. Poiché questa risposta è errata e non risponde nemmeno alla domanda , dovrebbe essere eliminata?
Aaron Hall

18

C'è un modo per sottostringa di una stringa in Python, per ottenere una nuova stringa dal 3 ° carattere alla fine della stringa?

Forse piace myString[2:end]?

Sì, questo in realtà funziona se si assegna o si legano , il nome, endper costante Singleton, None:

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

La notazione delle sezioni ha 3 argomenti importanti:

  • inizio
  • fermare
  • passo

I loro valori predefiniti quando non sono indicati sono None- ma possiamo passarli esplicitamente:

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

Se lasciare la seconda parte significa "fino alla fine", se si lascia la prima parte, inizia dall'inizio?

Sì, ad esempio:

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

Nota che includiamo start nella sezione, ma andiamo solo fino a, e non includendo, stop.

Quando il passaggio è None, per impostazione predefinita la sezione utilizza 1per il passaggio. Se passi con un numero intero negativo, Python è abbastanza intelligente da andare dalla fine all'inizio.

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

Spiego la notazione delle sezioni in modo molto dettagliato nella mia risposta a Spiega la domanda sulla notazione delle sezioni.


8

Ce l'hai proprio lì tranne "end". Si chiama slice notation. Il tuo esempio dovrebbe leggere:

new_sub_string = myString[2:]

Se si omette il secondo parametro, è implicitamente la fine della stringa.


6

Vorrei aggiungere due punti alla discussione:

  1. È possibile utilizzare Noneinvece su uno spazio vuoto per specificare "dall'inizio" o "fino alla fine":

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

    Ciò è particolarmente utile nelle funzioni, in cui non è possibile fornire uno spazio vuoto come argomento:

    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 ha oggetti slice :

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

6

Se myString contiene un numero di conto che inizia all'offset 6 e ha lunghezza 9, quindi è possibile estrarre il numero di conto in questo modo: acct = myString[6:][:9].

Se l'OP lo accetta, potrebbe voler provare, in modo sperimentale,

myString[2:][:999999]

Funziona: non viene generato alcun errore e non si verifica alcun 'string stringding' predefinito.


1
Penso che se vuoi usare questo metodo myString[offset:][:length]nel caso di OP, puoi semplicemente usaremyString[offset:][:]
victortv,

1
@VictorVal La risposta è per coloro (come me) che hanno imparato Python come 2 ° (3 °, 4 °, ...) linguaggio di programmazione e vogliono alcuni "hook di sintassi" familiari per avvicinarsi al linguaggio. Qualsiasi esperto di lingua molto probabilmente vedrà la mia risposta come un po 'sciocca.
CopyPasteIt

Le risposte come questa devono essere contrassegnate per l'eliminazione? Altre risposte spiegano la soluzione simile molto meglio, e vedere questa mi ha fatto graffiare la testa e cercare Python per alcuni minuti prima di rendermi conto che è proprio quel tipo di risposta.
Sebi,

3

Forse l'ho perso, ma non sono riuscito a trovare una risposta completa in questa pagina alle domande originali perché le variabili non sono ulteriormente discusse qui. Quindi ho dovuto continuare a cercare.

Dato che non sono ancora autorizzato a commentare, vorrei aggiungere la mia conclusione qui. Sono sicuro di non essere il solo interessato ad accedere a questa pagina:

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

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

Se lasci la prima parte, ottieni

 >>>myString[:end]
 'Hello' 

E se hai lasciato il: anche nel mezzo hai la sottostringa più semplice, che sarebbe il 5 ° carattere (conta a partire da 0, quindi in questo caso è lo spazio vuoto):

 >>>myString[end]
 ' '

1

Bene, ho avuto una situazione in cui dovevo tradurre uno script PHP in Python, e aveva molti usi substr(string, beginning, LENGTH).
Se avessi scelto Python's string[beginning:end]avrei dovuto calcolare molti indici finali, quindi il modo più semplice era quello di usare string[beginning:][:length], mi ha risparmiato un sacco di problemi.


0

L'uso stesso degli indici hardcoded può essere un casino.

Per evitarlo, Python offre un oggetto incorporato slice().

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

Se vogliamo sapere quanti soldi mi sono rimasti.

Soluzione normale:

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

Usando le sezioni:

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

Usando la fetta ottieni leggibilità.


5
Forse questo non è il miglior esempio, perché gli indici hardcoded rimangono e la leggibilità deriva da variabili intermedie, che avresti potuto usare nel primo esempio.
ASalazar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.