Cum pot obține un subșir al unui șir în Python?

Există o modalitate de a subșir al unui șir în Python, pentru a obține un nou șir de la cel de-al treilea personaj la sfârșitul șirului?

Poate ca myString[2:end]?

Dacă plecarea a doua parte înseamnă 'până la sfârșitul', și dacă pleci prima parte, începe de la început?

Comentarii la întrebare (1)
Soluția
>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'

Python solicită acest concept "feliere" și funcționează pe mai multe siruri de caractere. Avea o privire de aici pentru o introducere cuprinzătoare.

Comentarii (0)

Doar pentru completitudine, ca nimeni altcineva nu a menționat acesta. Cel de-al treilea parametru pentru a o matrice felie este un pas. Deci inversează un șir de caractere este la fel de simplu ca:

some_string[::-1]

Sau selectând caractere alternative ar fi:

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

Capacitatea de a păși înainte și înapoi prin șirul menține coerența cu posibilitatea de a felie matrice de la început sau de sfârșit.

Comentarii (3)

Substr() în mod normal (de exemplu, PHP și Perl) funcționează în acest fel:

s = Substr(s, beginning, LENGTH)

Deci parametrii sunt început și "LUNGIME".

Dar Python's comportament este diferit; acesta așteaptă de la începutul și cea de după END (!). Acest lucru este greu de la fața locului de către începători. Deci varianta corectă pentru Substr(s, începutul, LUNGIME) este

s = s[ beginning : beginning + LENGTH]
Comentarii (4)

Un mod comun de a realiza acest lucru este prin șir de feliere.

MyString[a:b] vă oferă un subșir de index a - (b - 1).

Comentarii (0)

Un exemplu pare să fi dispărut aici: plin (de mică adâncime), copie.

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

Acesta este un idiom comun pentru a crea o copie de secvență tipuri (nu de internați siruri de caractere), [:]. Superficial exemplare o listă, a se vedea Python lista felie de sintaxă folosite pentru nici un motiv evident.

Comentarii (5)

există o modalitate de a subșir al unui șir în Python, pentru a obține un nou șir de 3 caractere la sfârșitul șirului?

Poate ca myString[2:end]`?

Da, acest lucru chiar funcționează dacă atribuiți, sau lega, numele, "sfârșitul", la constanta singleton, "Nici unul":

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

Felie notație are 3 argumente importante:

  • începe
  • stop
  • pas

Lor implicite atunci când nu sunt indicate ca "Nici unul" - dar putem să le treacă în mod explicit:

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

Dacă plecarea a doua parte înseamnă 'până la sfârșitul', dacă pleci prima parte, începe de la început?

Da, de exemplu:

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

Rețineți că vom include începe în felie, dar mergem doar până la, și inclusiv, oprește-te.

Atunci când pas este "Nici unul", în mod implicit felie folosește " 1 " pentru pasul. Dacă faci un pas cu un număr întreg negativ, Python este suficient de inteligent pentru a merge de la sfârșit spre început.

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

Am explicat felie de notație în detaliu în răspunsul meu pentru a Explica felie notație Întrebare.

Comentarii (0)

Te'am luat-o chiar acolo, in afara de "end". L's a numit felie de notație. Exemplul tău ar trebui să citească:

new_sub_string = myString[2:]

Dacă lăsați pe dinafară de-al doilea parametru este, implicit, sfârșitul șirului.

Comentarii (0)

Aș dori să adaug două puncte de discuție:

  1. Puteți utiliza "Nici unul", în schimb, pe un spațiu gol pentru a specifica "de la început" sau "la sfârșitul":

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

Acest lucru este deosebit de util în funcții, în cazul în care puteți't oferi un spațiu gol ca un argument:

def subșir(s, start, end): """Elimina "start" personaje de la început și "sfârșitul" caractere de sfârșit de șir s.

Exemple

subșir('abcde', 0, 3) 'abc' subșir('abcde', 1, None) 'bcde' """ return s[start:end]

  1. Python are felie obiecte:

idx = felie(2, Nici unul) 'abcde'[idx] == 'abcde'[2:] == 'cde'

Comentarii (0)

Poate am ratat-o, dar nu puteam't găsi un răspuns complet la această pagină la întrebarea inițială(s), pentru variabilele nu sunt discutate aici. Așa că a trebuit să caut mai departe.

De când am'm nu este încă permis să comenteze, să-mi add concluzia mea aici. Am'm sigur nu am fost singurul interesat de ea atunci când accesați această pagină:

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

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

Dacă pleci prima parte, veți obține

 >>>myString[:end]
 'Hello' 

Și dacă ai lăsat : în mijloc la fel de bine ai cea mai simplă subșir, care ar fi al 5-lea caracter (numeri incepand cu 0, deci's gol în acest caz):

 >>>myString[end]
 ' '
Comentarii (0)

Dacă myString conține un număr de cont care începe la offset 6 și are o lungime de 9, atunci puteți extrage numărul de cont în acest fel: acct = myString[6:][:9].

Dacă OP acceptă că, s-ar putea să doriți să încercați, într-un mod experimental,

myString[2:][:999999]

Acesta funcționează - nici o eroare este ridicat, și nici implicit 'string padding' are loc.

Comentarii (3)

Folosind hardcoded indici în sine poate fi un dezastru.

În scopul de a evita ca, Python oferă un built-in obiect slice().

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

Dacă vrem să știm câți bani mi-a mai rămas.

Soluție normală:

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

Folosind felii:

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

Folosind felie puteți câștiga lizibilitate.

Comentarii (1)