Behandling af strenge

Nogle gange har man brug for at kunne ændre i tekstrenge eller finde specielle ting deri. Tag f.eks. denne tekststreng:

hansboedker@dkmail.dk

Tekststreng fortæller os en del ting:

Det er en mail:
Fordi der er et @, og fordi den er tredelt:
  • hansboedker
  • dkmail
  • dk
Vi kender brugernavnet:
Brugernavnet er hansboedker
Vi kender domænenavnet:
Domænenavnet er dkmail
Vi kender top-level domænenavnet:
Top-level domænenavnet er: dk

Det kan vi læse, fordi vi hurtigt afkoder tekststrengens bogstaver og tegn. For at Python kan gøre det samme skal vi bruge nogle forskellige funktioner:

Slicing
Måden vi udskriver dele af sætningen på
len()
Giver længden på tekststrengen
count()
Tæller antallet af gange tegn eller strenge står der
find()
Finder tegn eller strenge
replace()
Erstatter tekststrenge

Slicing

Ved hjælp af slicing kan man opdele tekststrenge i mindre stykker. For at "slice" tekststykket anvender vi følgende syntaks

*tekststreng*[*startposition*:*slutposition*]

Tegnenes position i tekststrengen angives enten fra venstre med positive værdier eller fra Højre med negative. Se tabellen herunder:

h a n s b o e d k e r @ d k m a i l . d k
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
-21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

Lad os se på nogle eksempler med mailen fra før: hansboedker@dkmail.dk.

Først slicer vi navnet ud (i konsollen):

"hansboedker@dkmail.dk"[0:11]
'hansboedker'

Her udskriver vi tegnene fra 0 → 11. Læg mærke til at 11 ikke er med.

Da vi skal bruge denne mail mange gange, så laver vi den lige som variabel i stedet for:

>>> mail = "hansboedker@dkmail.dk"
>>> mail[0:11]
'hansboedker'

Vi kunne også have udeladt 0 som startværdi, da Python tolker en manglende værdi som enten fra start eller slutningen af strengen:

>>> mail = "hansboedker@dkmail.dk"
>>> mail[:11]
'hansboedker'

Lad os slice landekoden ud på to måder:

>>> mail[19:]
'dk'
>>> mail[-2:]
'dk'

Vi vælger altså selv om vi vil anvende de enkelte tegns positive eller negative placering. Se disse eksempler hvor domænenavnet bliver slicet ud:

>>> mail[12:18]
'dkmail'
>>> mail[-9:-3]
'dkmail'
>>> mail[-9:18]
'dkmail'	

Slice en slice

Man kan også slice en slice, altså udskille tegn fra en slicet tekst. Se nedestående eksempel fra Idle, hvor mailadressen først bliver slicet af to omgange:

>>> mail[12:]
'dkmail.dk'
>>> mail[12:][-2:]
'dk'

I første omgang bliver dkmail.dk slicet ud af af selve mailen. I anden omgang bliver der slicet fra position -2 i den nye tekststreng.

Bakke snagvendt

Som en lille sjov ting kan man også udskrive en tekststreng omvendt ved hjælp af slicing.

>>> mail[::-1]
'kd.liamkd@rekdeobsnah'	

Slice i spring

Med samme metode kan du også udskrive hvert andet tegn i tekstrengen:

>>> mail[::2]
'hnbekrdmi.k'

len() - antal tegn

len() tæller det samlede antal tegn der er i en streng. Her undersøger vi hvor mange tegn der er i mailen.

>>> len(mail)
21	

Mellemrum er også tegn:

>>> len("Mellemrum er også tegn")
22
>>> len("Mellemrumerogsåtegn")
19

count() - antal forekomster

count() tæller hvor mange gange noget forekommer i en tekstreng. Her tæller vi antallet af @ og dk

>>> mail.count("@")
1
>>> mail.count("dk")
3

@ står der altså 1 gang og dk 3.

Count kan f.eks. bruges til at sige om det er en gyldig emailadresse, ved at tjekke om der er et @. Se dette program:

mail = input("Indtast mail: ")

if mail.count("@") == 1:
	print ("\n\tDer er @ i mailen.")
else:
	print ("\n\tDer mangler @ i mailen.")	
>>> %Run test.py
Indtast mail: andreas@fakemail.dk

	Der er @ i mailen.
	
>>> %Run test.py
Indtast mail: betina_fakemail.dk

	Der mangler @ i mailen.

find() - find forekomster

find() bruges til at finde placeringen af en streng. Den anvendes på følgende måde:

>>> mail.find("@")
11	

Det kan vi bruge til at lave et program der udskriver brugernavnet i en mail:

mail = input("Indtast mail: ")

mail_a = mail.find("@")

brugernavn = mail[:mail_a]

print(f"Brugernavnet er: {brugernavn}")
>>> %Run test.py
Indtast mail: viggo37@fakemail.dk
Brugernavnet er: viggo37

replace() - erstat forekomster.

replace() bruges til at erstatte tekststrenge med andre tekststrenge. Funktionen anvendes på følgende måde:

replace([gammel tekst], [ny tekst])

Her vil vi ændre i denne tekstreng: Kurt kommer for sent i skole.. Først vil vi ændre Kurt til Karen og derefter i skole til på arbejde.

>>> sætning = "Kurt kommer for sent i skole"
>>> sætning
'Kurt kommer for sent i skole'
>>> sætning.replace("Kurt","Karen")
'Karen kommer for sent i skole'
>>> sætning.replace("i skole","på arbejde")
'Kurt kommer for sent på arbejde'
>>> sætning
'Kurt kommer for sent i skole'	

Læg mærke at replace() ikke ændrer på variablen, men kun output. Hvis variablen skal ændres, så skal det gøres som herunder.

>>> ny_sætning = sætning.replace("i skole","på arbejde")
>>> ny_sætning
'Kurt kommer for sent på arbejde'	

Dette kan bruges meget smart. På mange hjemmesider skal man bruge . (punktum) i stedet for , (komma), når man indtaster tal i udregninger. Her har jeg lavet en funktion der udskifter , til ., hvis brugeren indtaster forkert:

tal = input("Skriv et decimaltal: ")

tal = tal.replace(",",".")

print(tal)
>>> %Run test.py
Skriv et decimaltal: 2,5
2.5
>>> %Run test.py
Skriv et decimaltal: 2.5
2.5