Werken met tekst — indexering, slicing en f-strings
Stukjes uit tekst halen, opschonen, aanpassen en leesbare berichten bouwen met f-strings — plus de regel dat tekst niet ter plekke kan worden veranderd.
Hoe wil je leren?
Het probleem dat we oplossen
Een naam komt binnen via een formulier: " Rafi Ahmed ". Er zitten extra spaties aan beide kanten, en wat je nodig hebt is alleen de voornaam, plus een bericht — "Welcome, Rafi!".
Dat werk — tekst opschonen, er stukjes uit halen en er iets nieuws van bouwen — is een van de meest voorkomende taken in programmeren. Gebruikersnamen, e-mailadressen, id's, bestandsnamen, adressen, wat een API ook teruggeeft: allemaal tekst.
En er wordt vandaag nog iets duidelijk, het soort dat uren kost als je het niet weet: in Python kan tekst niet worden aangepast. Als je name.upper() schrijft, verandert name daarmee niet in hoofdletters. Waarom niet, en wat je in plaats daarvan doet, is het meest waardevolle deel van dit hoofdstuk.
Aan het einde van dit hoofdstuk kun je
- Elk teken bereiken via zijn index, van voren én van achteren
- Een stuk eruit knippen met een slice
- Tekst opschonen en aanpassen met
strip,upper,lower,replaceensplit - Uitleggen waarom het resultaat van een methode bewaard moet worden
- Leesbare berichten bouwen met f-strings
Voorkennis: Rekenkunde — deling, resten en de decimale val.
Aanhalingstekens — één of twee
Voor Python zijn 'Rafi' en "Rafi" hetzelfde. Beide bestaan zodat aanhalingstekens binnen de tekst geen problemen geven:
print("It's working")
print('She said "yes"')It's working
She said "yes"Drie aanhalingstekens houden tekst vast die over meerdere regels loopt:
note = """Dear customer,
Your order is confirmed.
Thank you."""
print(note)Dear customer,
Your order is confirmed.
Thank you.En \n maakt een nieuwe regel, \t een tab:
print("Name:\tRafi\nRole:\tLearner")Name: Rafi
Role: LearnerLengte en index
word = "PYTHON"
print(len(word))
print(word[0])
print(word[1])
print(word[-1])
print(word[-2])6
P
Y
N
OTwee dingen om goed te onthouden:
Tellen begint bij nul. Het eerste teken heeft index 0, het tweede 1. In een woord van zes tekens is de laatste index dus 5, niet 6. Vraag je om word[6], dan krijg je een IndexError. Deze fout van "één te veel" komt zo vaak voor dat hij een eigen naam heeft: een off-by-one-fout.
Negatieve indexen tellen vanaf het einde. word[-1] is het laatste teken, word[-2] het teken daarvoor. Dat is de makkelijke manier om het einde te bereiken zonder de lengte te kennen.
Slices — een stuk eruit knippen
word = "PROGRAMMING"
print(word[0:7])
print(word[7:11])
print(word[:7])
print(word[7:])
print(word[-4:])PROGRAM
MING
PROGRAM
MING
MINGword[a:b] betekent van a tot maar niet inclusief b. De eindindex wordt weggelaten.
Dat voelt eerst raar, maar het levert iets op: word[0:7] en word[7:11] sluiten precies op elkaar aan, zonder dat een teken dubbel voorkomt of ontbreekt. Het eerste getal weglaten betekent "vanaf het allereerste begin", en het tweede weglaten betekent "helemaal tot het einde".
Tekst kan niet worden aangepast
Dit is de belangrijkste regel van dit hoofdstuk:
name = "rafi"
name[0] = "R"Traceback (most recent call last):
File "D:\python-lab\lesson-06\demo.py", line 2, in <module>
name[0] = "R"
~~~~^^^
TypeError: 'str' object does not support item assignmentDe eerste File-regel toont het volledige pad van je bestand, dus op jouw computer ziet die er anders uit. De echte melding staat op de laatste regel: een teken in bestaande tekst kan niet worden vervangen. Hoe werkt het maken van hoofdletters of trimmen dan eigenlijk? Het antwoord: Python verandert het origineel niet, het bouwt een nieuw stuk tekst en geeft dat terug.
name = " rafi "
print(name.strip())
print(name.strip().upper())
print("After all that, name is still:", name)rafi
RAFI
After all that, name is still: rafiname is helemaal niet veranderd. strip() maakte een nieuw, schoon stuk tekst, en we hebben dat alleen afgedrukt — we hebben het nooit opgeslagen.
Dus je moet het resultaat bewaren:
name = " rafi "
clean_name = name.strip().upper()
print(clean_name)RAFIOf wijs het terug toe aan dezelfde naam — name = name.strip(). Deze fout, een methode aanroepen en het resultaat weggooien, overkomt iedereen in het begin. En er komt geen foutmelding, daarom duurt het even voordat je hem ziet.
Handige methoden
raw = " Rafi Ahmed "
print(raw.strip())
print(raw.strip().lower())
print(raw.strip().upper())
print(raw.strip().replace(" ", "_"))
print(len(raw), len(raw.strip()))
print("rafi" in raw.lower())Rafi Ahmed
rafi ahmed
RAFI AHMED
Rafi_Ahmed
14 10
Truestrip()— haalt witruimte aan het begin en het einde weg (niet in het midden)lower()/upper()— verandert hoofdlettersreplace(a, b)— zetboveral waarastondin— zegt of het ene stuk tekst binnen een ander voorkomt
En split() breekt tekst in stukken:
full_name = "Rafi Ahmed Khan"
parts = full_name.split(" ")
print(parts)
print(parts[0])
print(len(parts))['Rafi', 'Ahmed', 'Khan']
Rafi
3Het ding tussen vierkante haken is een lijst, die in een later hoofdstuk van de cursus aan bod komt. Weet voorlopig alleen dat split() de stukken zo teruggeeft, en dat een index er één stuk uit haalt.
Maak schoon voordat je vergelijkt. Als een gebruiker"Rafi "typt, is dat niet gelijk aan"rafi"— een spatie aan het eind en een hoofdletter maken er twee verschillen van. Daarom is.strip().lower()aanroepen vóór het vergelijken bijna een vaste gewoonte in echte projecten.
f-strings — de makkelijke manier om een bericht te bouwen
Tekst en getallen mengen was tot nu toe omslachtig. Een f-string maakt het eenvoudig: een f vóór de aanhalingstekens, en wat je wilt binnen accolades {}:
name = "Rafi"
items = 3
price = 12.5
print(f"Hello, {name}!")
print(f"{items} items cost {items * price}")
print(f"Rounded: {items * price:.2f}")Hello, Rafi!
3 items cost 37.5
Rounded: 37.50Let op drie voordelen: je kunt binnen de accolades rekenen (items * price), je hoeft nooit aan types te denken (getallen worden vanzelf tekst), en :.2f legt het aantal decimalen vast — wat elke weergave van een geldbedrag nodig heeft.
Kijk eens wat er gebeurt als de f wordt vergeten:
name = "Rafi"
print("Hello, {name}")Hello, {name}Geen foutmelding, alleen een verkeerd bericht. Als je dit eenmaal hebt gezien, herken je het later makkelijk.
Een compleet voorbeeld
account.py:
# Turn a raw form entry into a clean display name and a login id
raw_input_name = " Rafi Ahmed "
domain = "example.com"
clean = raw_input_name.strip()
parts = clean.split(" ")
first_name = parts[0]
last_name = parts[-1]
login_id = f"{first_name.lower()}.{last_name.lower()}"
email = f"{login_id}@{domain}"
initials = f"{first_name[0]}{last_name[0]}"
print(f"Display name : {clean}")
print(f"Login id : {login_id}")
print(f"Email : {email}")
print(f"Initials : {initials}")
print(f"Name length : {len(clean)} characters")Display name : Rafi Ahmed
Login id : rafi.ahmed
Email : [email protected]
Initials : RA
Name length : 10 charactersWaarom parts[-1]? Omdat de naam van iemand uit drie delen kan bestaan. Het laatste stuk van achteren pakken werkt, of er nu twee of drie delen zijn.
Wanneer het misgaat
IndexError: string index out of range De index die je vroeg, ligt voorbij het einde van de tekst. Onthoud: als len(word) 6 is, zijn de geldige indexen 0 tot en met 5. Voor het laatste teken is word[-1] het veiligst om te schrijven.
TypeError: 'str' object does not support item assignment Je probeerde één teken binnen tekst te veranderen. Dat kan niet — bouw in plaats daarvan nieuwe tekst, bijvoorbeeld word = "R" + word[1:].
Ik heb de methode aangeroepen en er veranderde niets Het resultaat is nergens opgeslagen. name.strip() verandert name niet; je hebt name = name.strip() nodig.
strip() verwijdert de spaties in het midden niet strip() werkt alleen aan de twee uiteinden. Om de spaties binnenin te verwijderen gebruik je replace(" ", "").
Het f-stringbericht komt er verkeerd uit Controleer of de f direct vóór de aanhalingstekens staat. Zonder die f worden de accolades als gewone tekens afgedrukt.
NameError — de naam binnen de f-string is onbekend Wat je binnen de accolades schreef, is nooit aangemaakt, of het is verkeerd gespeld.
Stap 4 van 6 — Voorspellen
Test je begrip
Wat is de uitvoer van deze vier regels?
word = "PYTHON"
print(word[0])
print(word[-1])
print(word[1:4])- AP N YTH
- BY N YTHO
- CP O YTH
- DP N YTHO
De bedoeling was Hello, RAFI! af te drukken, maar de naam komt in kleine letters uit en heeft nog steeds spaties aan de randen. Waarom?
name = " rafi "
name.strip()
name.upper()
print(f"Hello, {name}!")- AEen methode kan maar één keer op een stuk tekst worden aangeroepen, niet twee keer
- BEen f-string kan het resultaat van een methode niet tonen
- C`strip()` en `upper()` veranderen het origineel niet — ze geven nieuwe tekst terug, dus het resultaat moet terug worden toegekend aan `name`
- D`strip()` kan niet vóór `upper()` worden aangeroepen; de volgorde moet worden omgedraaid
Wat print deze f-string?
item = "pen"
qty = 3
price = 12.5
print(f"{qty} x {item} = {qty * price:.2f}")- A3 x pen = 37.50
- B3 x pen = 37.5
- C{qty} x {item} = {qty * price}
- D3 x pen = 3 * 12.5
Voor antwoorden heb je een account nodig
Log in om je antwoorden te controleren
De vragen staan hierboven, en ze in je hoofd uitwerken is waar het om draait. Log in om de antwoorden, de uitleg en de hints in drie niveaus te zien.
Jouw beurt
Schrijf een bestand genaamd slug.py dat een titel omzet in een vorm die geschikt is voor een webadres.
Startwaarde: title = " Learn Python Step By Step "
De uitvoer moet zijn:
Title : Learn Python Step By Step
Slug : learn-python-step-by-step
Slug length: 25Vier voorwaarden:
- Trim de extra spaties aan beide kanten
- Zet alles in kleine letters
- Vervang de spaties binnenin door streepjes
- Print alle drie de regels met f-strings
Doe daarna nog één ding extra: verander title naar " Python for Beginners " en voer het uit. Als de nieuwe titel goed uitkomt zonder dat je de code hebt aangepast, betekent dat dat je een echte berekening hebt geschreven in plaats van de antwoorden met de hand in te typen.
Deze missie heeft nog meer
Wat je hierboven las is de volledige missie — er is niets uit weggelaten. Pro voegt toe:
- Wat er echt onder de motorkap gebeurt: hoe Python dit uitvoert
- De volledige oplossing van de oefening, stap voor stap uitgewerkt
- Moeilijkere extra oefeningen
- De sollicitatievraag over dit onderwerp, met een modelantwoord
Stap 6 van 6
Uitdaging — de hoofdstukquiz
Tien vragen van makkelijk naar moeilijk. De laatste zijn met opzet lastig.
Log in om de quiz te maken