python format - C'è un modo per sottostrare una stringa?




replace split (10)

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 come myString[2:end] ?

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


Answers

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


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

Per evitare ciò, Python offre una slice() oggetti slice() integrata.

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à.


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

s = Substr(s, beginning, LENGTH)

Quindi i parametri stanno 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]

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]
 ' '

>>> 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 here per una presentazione completa.


È piuttosto semplice:

s = 'Hello, World!'
print(s[:]) # prints "Hello, World!"
print(s[:5]) # prints Hello
print(s[5:]) # prints , World!
print(s[3:7]) # prints "lo, "

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-used-for-no-obvious-reason .


Vorrei aggiungere due punti alla discussione:

  1. Puoi utilizzare 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 oggetti slice :

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

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.


È una questione di convenzioni, davvero. string sembra più simile allo stile C / C ++. La convenzione generale è quella di utilizzare qualsiasi scorciatoia fornita dalla lingua scelta (int / Int per Int32 ). Questo vale anche per "oggetto" e decimal .

Teoricamente questo potrebbe aiutare a portare il codice in qualche futuro standard a 64 bit in cui "int" potrebbe significare Int64 , ma non è questo il punto, e mi aspetto che qualsiasi procedura guidata di aggiornamento modifichi qualsiasi riferimento int a Int32 comunque per sicurezza.





python string