Start | strangar
 

Strängar



Beskrivning av grunderna i hur du manipulerar strängar i python.

Skapa och skriva ut strängar

Att skapa en sträng är enkelt.
namn = "Olle" print(namn)
Vi kan skapa väldigt långa texter över flera rader såhär ...
text = """ Detta är en väldigt lång text över flera rader. För att skapa detta inleder vi med 3 stycken citat och avslutar med 3 stycken citat. """ print(text)

Specialtecken i en sträng

Ibland behöver man specialtecken i strängen. Säg tex att vi önskar citat -tecken i vår sträng. Hur löser vi det, då strängar omges av citat när de tilldelas? Vi löser detta genom att placera back-slash \ framför citattecknet.
txt = "vi hade ett \"möte\" med rektor" print(txt)
Det finns ett trick ytterligare. Det är även tillåtet att markera en sträng med enkel -citat. Genom att omge strängen med enkel -citat, så kan vi inne i strängen använda vanliga citat.
txt = 'Det var en väldigt intressant "fest" kan man säga' print(txt)
Ibland kanske man vill ha backslash, t.ex. i en sökväg. Då använder man escape-tecknet och därefter en baskslash.
txt = "c:\\home\\directory\\text.txt" print(txt) txt = 'c:\\home\\directory\\text.txt' print(txt)
Det kanske känns en smula osnyggt och instabilt hålla öronkoll på escape -tecken och riktiga backslash. Hur gör man om man behöver dubbla backslash? I python finns alltid ett verktyg ytterligare i bakfickan ...

rå sträng


Man kan även skapa en rå sträng. Om man behöver ange text sökvägar för filer (i windows används tex backslash i sökvägar) eller har specialtecken som helt enkelt är jobbiga få dit, då kan man skapa en rå sträng.

Det gör vi genom ett litet r framför strängen. Detta löser de festa problem utom citat -teckengrejen som fortfarande måste löses enligt konceptet här ovan.
path = r"c:\windows\home\kalle\text.txt" print(path)
f = open(r"C:\Users\Viking\Desktop\text.txt")

Bygga ihop strängar

Strängar går att bygga ihop till längre strängar.
namn1 = "Olle" namn2 = "Ville" text = namn1 + " är kompis med " + namn2 print(text)
Kom dock ihåg att du kan bara bygga ihop strängar med strängar. Om du behöver siffror i din sträng, som exempel, då måste du konvertera siffran till sträng för att det skall fungera.
namn1 = "Olle" ar = "20" text = namn1 + " är "+str(ar)+" år gammal" print(text)

Strängens längd med len()

Vi kan enkelt få veta hur lång vår sträng är med len()
namn = "Olle" antal = len(namn) print(antal)

Strängens enskilda tecken

Strängens tecken kan vi komma åt som individer genom dess index. Första tecknet är index 0.
str = "Detta är en sträng" print(str[0]) print(str[1])
01234567891011121314151617
Detta är en sträng


Men vi kan inte ändra enskilda tecken (som vi kan i listor). Men vi kan tilldela strängen som helhet ett nytt värde.
namn = "Olle" print(namn[0]) namn = "Julia" print(namn[0])
Vi kan faktiskt gå bakvägen med negativt index. Det betyder att positionen räknas bakifrån. Sista bokstaven är då -1.
namn = "Olle" print(namn[-1]) print(namn[-4])

Komma åt ett segment av tecken

Vi kan komma åt segment av bokstäver. Första siffran är den position där vi startar, där 0 är första bokstaven. Den andra siffran stannar vi innan.
namn = "Trappuppgång" print(namn[1:5]) print(namn[5:8])
Om vi skippar siffran före : så antas att den är 0 (dvs från start) och om vi skippar sista efter : så antas vi menar till slutet på strängen.
namn = "Trappuppgång" print(namn[0:5]) print(namn[5:])
Vi kan även även använda negativa index. Så för att t.ex. plocka ut de 3 sista bokstäverna i en sträng. Vi startar alltså vid -3, vilket 3 från slutet. Sedan går vi till slutet.
s = "Detta är en text som slutar med Hej" slutet = s[-3:] print(slutet)
Säg att vi vill plocka bort första tecknet i en sträng.
s = "telekommunikation" print(s) s = s[1:] print(s) s = s[1:] print(s) s = s[1:] print(s)
Vi kan loopa till strängen är bortskalad framifrån. Varför fungerar det? Som du lärde dig i logik, så är en tom sträng = ingenting = false. Så när inget är kvar slutar while snurra.
s = "telekommunikation" while(s): s = s[1:] print(s)
Eller sista tecknet...
s = "telekommunikation" print(s) s = s[:-1] print(s) s = s[:-1] print(s) s = s[:-1] print(s)
Vi kan loopa till strängen är bortskalad bakifrån. Varför fungerar det? Som du lärde dig i logik, så är en tom sträng = ingenting = false. Så när inget är while färdig.
s = "telekommunikation" while(s): s = s[:-1] print(s)
När du längre fram läst om listor och split så kommer du förstå att det är väldigt användbart att kunna slice:a i strängar och listor såhär, dvs att demontera data och bygga ihop på nytt.

tentafråga


Vad blir utskriften? Vi startar på tecken -2. Obs att -1 är sista tecknet (finns inget -0), så -2 är näst-sista tecknet. Det står inget efter : vilket betyder att vi läser fram till slutet.
s = 'typhoon'[-2:] print(s)

stega (3:e parametern)


Vi kan sätta en siffra i en 3e slot och det är hur mycket den skall stega vid slice.

Plockar ut varannan bokstav...
s = "telekommunikation" s2 = s[::2] print(s2)
Vi vänder strängen baklänges
s = "telekommunikation" s2 = s[::-1] print(s2)

strip()


Säg att vi är osäkra på om det ligger space i slutet av strängen. Sånt kan hända t.ex. om vi t.ex. läser in data från en fil. Vi kan säkerställa att eventulla mellan plockas bort med strip().
s = " Detta är en text som slutar med Hej " s = s.strip() slutet = s[-3:] print(slutet)
Klipper ut första ordet...
word = "telefon apparat" word = word[:word.index(' ')] print(word)

Iterera över en sträng

Vi kan iterera över strängen såhär. Dvs vi skapar en loop från 0 som räknar upp till len(namn). Observera att om len(namn) som i detta fall är 4, så får vi en loop mellan 0 och 3. Men det är helt i sin ordning då en sträng med 4 bokstäver indexeras från 0 till 3.
namn = "Olle" for i in range(0,len(namn)): print(namn[i])
I ovan sitation så skapar vi en loop där variabeln i ökar från 0 till 3 genom varje varv i loopen. Med denna siffra i kan vi indexera bokstäverna i strängen namn.

Vi kan göra samma sak på ett lite smidigare sätt.
namn = "Olle" for t in namn: print(t)
Med denna konstruktion så kommer t i varje varv, med start från första, vara en bokstav i strängen namn. Vi får samma slutresultat men koden är mindre och enklare.

Ibland behöver vi indexet och då är det smartare loopa med range. Behöver vi inte indexet, så är det snyggare skriva som ovan.

Delmängd av sträng

Vi kan testa om en mindre sträng finns inuti en större.
namn = "Olle" print("ll" in namn)
Eller ...
namn = "Olle" print("ck" in namn) print("ck" in "Nicklas")

Formatera utskrifter med %

Det finns olika sätt att formatera utskrifter så att de blir snygga. Ett arv från kodningens barndom (språket C) är bl.a. dessa koder, som går att använda i print.

Kod Beskrivning 
%dinteger decimal
%iinteger decimal
%ooktal (bas 8)
%xhexadecimal (bas 16)
%XHEXadecimal (bas 16)
%efloating point exp form
%Efloating point EXP form
%ffloating point decimal form
%Ffloating point decimal form
%censtaka tecken
%rKonv. till sträng med repr()
%sKonv. till sträng med str()
%aKonv. till sträng med ascii()


Studera följande ....
namn1 = "Olle" namn2 = "Ville" print("%s är kompis med %s" %(namn1,namn2))
Fungerar med siffror också
x = 10 y = 10 print("%d * %d" %(x,y))
Fungerar med flyttal också
pi = 3.14 radien = 10 arean = pi * radien * radien print("arean = pi * radien*radien = %f * %f * %f = %f" %(pi,radien,radien,arean))
Vi kan formatera flyttalen. Säg att vi vill ha max 2 decimaler.
pi = 3.14 radien = 10 arean = pi * radien * radien print("A=pi*r*r = %.2f * %.2f * %.2f = %.2f" %(pi,radien,radien,arean))

f-strings

Ytterligare en användbar formateringsmöjlighet, potentiellt enklare än ovan c-koder, i python, är f-strings. Vi stoppar in ett litet f framför vår sträng och kan då stoppa in våra variabler direkt i strängen inom { .. }, vilka sedan substitueras mot dess värden.
namn1 = "Olle" namn2 = "Ville" print(f"{namn1} är kompis med {namn2}")
Vi kan även använda siffror och t.o.m. räkna lite.
x = 4 y = 3 print(f"{x} * ({y} + 1) = {x * (y + 1)}")

format

Genom att använda format kan sofistikerad formatering uppnås. Nedan är bara ett enstaka exempel, då format är ett helt eget kapitel. Läs mer under format.

print('{:^16}'.format('mitten')) print('{:_^16}'.format('mitten')) print('{:-^16}'.format('mitten'))

inbyggda strängfunktioner

Klicka för mer exempel hur dessa inbyggda sträng -funktioner fungerar.

s.format()Formaterar en sträng
s.capitalize()Första tecknet VERSAL
s.center(width)s centrerad i fält width
s.count(sub)Räknar förekomsten av sub
s.find(sub)Hittar första förekomsten
s.join(list)Bygger sträng av delar
s.ljust(width)Likt center fast vänster
s.lower()Alla små bokstäver
s.lstrip()Tar bort space i början
s.replace(o,n)Ersätter old med new
s.rfind(sub)Som find med bakifrån
s.rjust(width)Som center högerjusterat
s.rstrip()Tar bort space i slutet
s.split()Splittar strängen
s.title()Stor Första Bokstav
s.upper()Alla tecken VERSALER

import re

Denna modul ger dig tillgång till reguljära uttryck och dess kraft. Du att du har möjligt labba med reguljära uttryck.

re.split()Splitta på vad som matchar
re.sub()Substituera vad som matchar
re.findall()Skapa lista av vad som matchar


Det kan vara intressant snegla på filhantering för att läsa textfiler från disk.

Lite frågor

Vad är en rå sträng?
  Du sätter ett litet r framför citat och då behöver du inga escape -tecken i strängen. Mycket bra om man har sökvägar till filer t.ex. eller andra strängar med komplicerade tecken.
  En rå sträng är en väldigt ohövlig sträng full av svordomar
Om s = "telefon", vad är då len(s)
  8
  5
  7
  6
Om s = "telefon", vad är då s[0]
  None
  n
  t
  telefon
Om s = "telefon", vad är då s[-1]
  None
  n
  t
  telefon
Om s = "telefon", vad är då s[1:2]
  None
  n
  t
  e
Om s = "telefon", vad är då s[1:]
  None
  n
  telefo
  elefon
Om s = "telefon", vad är då s[:-1]
  None
  n
  telefo
  elefon
Om s = "telefon", vad är då s[:3]
  None
  n
  tel
  fon
Om s = "telefon", vad är då s[3:]
  efon
  n
  tel
  fon


20.589113235474 ms