Domanda C'è un modo per sottostrare una stringa in Python?


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

Forse piace myString[2:end]?

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


1587
2018-03-19 17:29


origine


risposte:


>>> 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. Guarda Qui per un'introduzione completa.


2406
2018-03-19 17:30



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

some_string[::-1]

O selezionando caratteri alternativi sarebbe:

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

La possibilità di andare avanti e indietro attraverso la stringa mantiene la coerenza con la possibilità di allineare una fetta dall'inizio o dalla fine.


304
2018-03-20 00:58



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

s = Substr(s, beginning, LENGTH)

Quindi i parametri sono beginning e LENGTH.

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

s = s[ beginning : beginning + LENGTH]

91
2017-08-04 11:43



Un modo comune per raggiungere questo obiettivo è l'affettamento delle stringhe. MyString[a:b] ti fornisce una sottostringa dall'indice a a (b - 1)


45
2018-03-02 05:19



Un esempio sembra mancare qui: copia completa (superficiale).

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

Questo è un idioma comune per creare una copia di tipi di sequenza (non di stringhe internate). [:] Shallow copia una lista, vedi python-list-slice-usato-per-no-ovvio-ragione.


17
2018-03-19 18:02



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

Forse piace myString[2:end]?

Sì, funziona davvero se si assegna, o legare, il nome,end, a costante singleton, None:

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

La notazione Slice ha 3 argomenti importanti:

  • inizio
  • Stop
  • passo

I loro valori predefiniti quando non sono dati 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 abbandona la prima parte, inizia dall'inizio?

Sì, ad esempio:

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

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

Quando il passo è None, per impostazione predefinita utilizza la fetta 1 per il passaggio. Se passi con un intero negativo, Python è abbastanza intelligente da andare dall'inizio alla fine.

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

Spiego dettagliatamente la notazione delle sezioni in la mia risposta a Explain slice notation Question. 


12
2018-06-23 21:53



Ce l'hai proprio eccetto per "fine". Si chiama notazione di sezione. Il tuo esempio dovrebbe leggere:

new_sub_string = myString[2:]

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


7
2018-03-19 17:31



Vorrei aggiungere due punti alla discussione:

  1. Puoi usare None invece su uno spazio vuoto per specificare "dall'inizio" o "fino alla fine":

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

    Ciò è particolarmente utile nelle funzioni, dove 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 fetta oggetti:

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

6
2017-08-31 04:28



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

Dato che non ho ancora il permesso di commentare, lasciatemi aggiungere la mia conclusione qui. Sono sicuro che non ero l'unico 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: nel mezzo hai ottenuto anche la sottostringa più semplice, che sarebbe il quinto carattere (il conteggio inizia con 0, quindi in questo caso è lo spazio vuoto):

 >>>myString[end]
 ' '

2
2018-03-18 12:01



L'uso degli indici hardcoded può essere un disastro.

Per evitare ciò, Python offre un oggetto integrato 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

Utilizzando le fette:

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

Usando la fetta guadagni leggibilità.


0
2017-08-31 04:50