Module 8: Strings
Leerdoelen
- Strings
- Strings over meerdere regels
- Positive and negative indices voor strings
- Substrings
- Onveranderlijkheid van strings
- String methodes strip(), upper(), lower(), find(), replace(), split(), en join()
8.1 Herhaling
Je hebt al redelijk wat met string gewerkt en over strings geleerd. Zo weet je reeds dat een string een tekst is, die omsloten is door enkele of dubbele aanhalingstekens, en dat een string iedere lengte mag hebben, inclusief nul tekens lang. Je weet ook dat je twee (of meer) strings aan elkaar kunt plakken met behulp van de +
, en dat je een string zichzelf kunt laten herhalen door middel van de *
. Bijvoorbeeld:

Je kan ook de lengte van een string bepalen a.d.h.v. de len()
functie. Bij vergelijkingen tussen strings worden de alfabetische regels aangehouden, waarbij hoofdletters altijd eerder in het alfabet staan dan kleine letters. Via de in
operator kan je testen of tekens of substrings voorkomen in een string en met een for
loop kan je alle tekens in een string doorlopen.

8.2 Strings over meerdere regels
In Python kunnen strings meerdere regels beslaan. Dat kan nuttig zijn wanneer je een erg lange string in je programma hebt, of als je de output van de string op een specifieke manier wilt formatteren. Dit kan op twee manieren bereikt worden:
-
Met enkele of dubbele aanhalingstekens, en een indicatie dat de string doorloopt op de volgende regel door een backslash aan het einde van de regel te zetten.
-
Met drievoudige enkele of dubbele aanhalingstekens.
8.2.1 Enkele of dubbele aanhalingstekens om de string

Geeft als resultaat:

Als je deze code uitvoert, zie je dat Python de string als een geheel interpreteert. De backslash (\
) die aangeeft dat de string verder gaat op de volgende regel is algemener bruikbaar dan alleen voor strings: je kunt hem achter ieder Python statement zetten om aan te geven dat het statement verder gaat op de volgende regel. Dat kan nuttig zijn bij bijvoorbeeld lange berekeningen.
De aanbevolen manier om strings over meerdere regels te spreiden in Python is echter het gebruik van drievoudige aanhalingstekens. Ik heb in een eerder hoofdstuk aangegeven dat je die gebruikt om lang commentaar in de code op te nemen, maar feitelijk komt het erop neer dat je dan een lange string midden in je programma zet. Zo’n string doet niks, tenzij je hem aan een variabele toekent.
8.2.2 Drievoudige dubbele aanhalingstekens

Geeft als resultaat:

Het opvallende verschil tussen deze twee voorbeelden is dat in het eerste voorbeeld de string beschouwd werd als een lange, doorlopende serie tekens, terwijl in het tweede voorbeeld de verschillende regels op meerdere regels geprint wordt. De reden dat dat gebeurt in het tweede voorbeeld is dat er een onzichtbaar teken staat aan het einde van iedere regel, dat aangeeft dat Python naar een nieuwe regel moet gaan voordat verder geprint wordt.
8.2.3 Newline
Dit is een zogeheten “newline” teken, en je kunt het expliciet in een string opnemen, door gebruik te maken van de code "\n
". Deze code moet je niet lezen als twee tekens, de backslash en de "n", maar als een enkel “newline” teken. Je kunt met dit teken ervoor zorgen dat de output over meerdere regels geprint wordt. Dat kan zelfs als je de backslash aan het einde van een regel zet om aan te geven dat de string over meerdere regels verspreid is, als in het eerste voorbeeld.
Bijvoorbeeld:

Geeft als resultaat:

Dit betekent dat als je niet die automatische “newlines” wilt hebben in een string die meerdere regels beslaat, je de eerste aanpak moet gebruiken, met de backslash aan het einde van iedere regel. Als je wel meerdere regels wilt, dan is de tweede aanpak waarschijnlijk het beste leesbaar.
8.3 Tekens in een string
Een string is een verzameling van tekens in een specifieke volgorde. Je kunt de individuele tekens van een string middels indices benaderen.
8.3.1 String indices
Ieder teken in een string heeft een positie, en die positie kun je weergeven door het index nummer van de positie. De indices beginnen bij 0 en lopen op tot aan de lengte van de string. Hieronder zie je het woord “python” op de eerste regel, met op de tweede en derde regel indices voor ieder teken in deze string:

Zoals je kunt zien, kun je positieve indices gebruiken die beginnen met 0 bij de eerste letter van de string, en die oplopen tot het einde van de string. Je kunt ook negatieve indices gebruiken, die starten met -1 bij de laatste letter van de string, en die aflopen totdat de eerste letter van de string bereikt is.
De lengte van een string s
kun je berekenen met len(s)
; de laatste letter van de string heeft dus index len(s)-1
. Met negatieve indices heeft de eerste letter van de string de index -len(s)
.
Als een string is opgeslagen in een variabele, dan kun je de individuele letters van de string benaderen via de variabele naam en de index van de gevraagde letter tussen vierkante haken ([]
) rechts ernaast.

8.3.2 Strings doorlopen
Eerder is uitgelegd hoe je de tekens van een string kunt doorlopen middels een for
loop:

Geeft als resultaat:

Nu je indices begrijpt, realiseer je je waarschijnlijk wel dat je die ook kunt gebruiken om een string te doorlopen:

Geeft als resultaat:

Als je voldoende hebt aan toegang krijgen tot de individuele tekens in de string, is de eerste methode, waarbij de constructie for <teken> in <string>
wordt gebruikt, verreweg het meest elegant en leesbaar. Maar soms moet je een probleem oplossen waarbij een andere methode nodig is.
Magje
Schrijf een programma dat van een string de indices print van alle klinkers (a, e, i, o, en u). Dit kan met een for
loop of een while
loop, maar de while
lijkt iets geschikter.
Schrijf een programma dat twee strings gebruikt. Voor ieder teken in de eerste string dat in de tweede string precies hetzelfde teken heeft met precies dezelfde index, druk je het teken en de index af. Pas op voor een “index out of bounds” runtime error. Test met de strings "The Holy Grail"
en "Life of Brian"
.
Schrijf een functie die een string als argument krijgt, en die dan een nieuwe string retourneert die hetzelfde is als het argument, maar waarbij ieder teken dat geen letter is vervangen is door een spatie (bijvoorbeeld, de uitdrukking "ph@t l00t"
wordt gewijzigd in "ph t l t"
). Om zo’n functie te schrijven begin je met een lege string, en doorloopt de tekens van het argument één voor één. Als je een acceptabel teken tegenkomt, voeg je het toe aan de nieuwe string. Anders voeg je een spatie toe aan de nieuwe string. Je kunt testen of een teken acceptabel is met eenvoudige vergelijkingen, bijvoorbeeld, alle kleine letters kun je herkennen omdat ze de test ch >= 'a' and ch <= 'z'
True
maken.
8.4 String methodes
Een kerneigenschap van strings is dat ze onveranderbaar zijn. Dit betekent dat strings niet kunnen wijzigen. Als je een string wilt wijzigen, kan je geen nieuwe waarde toekennen aan een individueel teken uit de string. In plaats daarvan moet je de variabele die de string bevat geheel overschrijven.
Er zijn een aantal methodes beschikbaar die ontworpen zijn om strings te bewerken. Omdat strings onveranderbaar zijn, zullen deze methodes nooit de string waarop ze werken wijzigen, maar een gewijzigde versie van de string retourneren.
Al de string methodes worden aangeroepen via de syntax <string>.<methode>()
, met andere woorden, je specificeert de string waarop de methode moet werken, gevolgd door een punt, gevolgd door de methode.
De meeste string methodes zijn geen deel van een module en kan je aanroepen zonder iets te moeten importeren. Er is een string module die bepaalde nuttige constanten en methodes bevat die je in je programma’s kunt gebruiken, maar de methodes die hieronder worden vernoemd, kun je gebruiken zonder de string module te importeren.
8.4.1 upper() en lower()
upper()
creëert een versie van een string met alle letters als hoofdletters. lower()
werkt op dezelfde manier, maar maakt van alle letters kleine letters. Geen van beide methodes heeft parameters.

8.4.2 strip()
strip()
verwijdert spaties aan het begin en einde van een string, inclusief eventuele “newline” tekens en andere tekens die als spaties gezien kunnen worden. Als je iets anders dan spaties wilt verwijderen, kun je als parameter een string meegeven die bestaat uit alle te verwijderen tekens.

8.4.3 split()
split()
splitst een string op in woorden, gebaseerd op een gegeven teken of substring die als separator beschouwd wordt. De separator is een parameter, en als die niet is opgegeven, is de separator de spatie, wat inhoudt dat je een string inderdaad opsplitst in de afzonderlijke woorden (waarbij interpunctie die aan woorden vastzit beschouwd wordt als een onderdeel van de desbetreffende woorden). Als de separator meerdere keren naast elkaar staat, dan worden de extra separatoren genegeerd (dat wil zeggen dat met spaties als separator, het niet uitmaakt of er tussen twee woorden één spatie staat, of meerdere).
Het resultaat van deze opsplitsing is een “lijst” van woorden. Lijsten komen aan bod in een later hoofdstuk. Als je de afzonderlijke woorden in de lijst wilt benaderen, kan je de constructie for <woord> in <lijst>
gebruiken.

8.4.4 join()
join()
is de tegenhanger van split()
. join()
plakt een lijst van woorden aaneen tot een string, waarbij de woorden in de string van elkaar gescheiden zijn middels een specifieke separator. Dit klinkt wellicht alsof dit een methode van lijsten zou moeten zijn, maar om historische redenen is het gedefinieerd als een string methode. Omdat alle string methodes worden aangeroepen als <string>.<methode>()
, moet er een string staan voor de aanroep van join()
. Die string is de separator die je wilt gebruiken, terwijl de parameter die je meegeeft de lijst is waarvan je de woorden aan elkaar wilt plakken. De retourwaarde is, als altijd, de resulterende string.
