← Python/Tekst begrijpen en verwerken
Les 3 van 8
MODULE 05 · 03◷ 26 min

Zoek tekst en verwijder alleen het bedoelde begin

Na deze les kun je
  • Aanwezigheid van een deeltekst van haar index onderscheiden
  • Voorvoegsels hoofdlettergevoelig controleren
  • Een aanwezig voorvoegsel precies één keer verwijderen

Je programma krijgt een bestandslabel met soms een herkenbaar voorvoegsel. Je wilt weten of dat label ermee begint en waar een bepaald woord staat. Dezelfde tekst overal vervangen kan daarbij te veel weghalen; je gaat zoeken voordat je gericht iets verwijdert.

Aanwezig of op welke positie?

Met part in text krijg je een boolean: staat die reeks codepunten ergens in de tekst? De operator kijkt naar de complete deeltekst. Hij vraagt niet of losse letters verspreid voorkomen en verandert niets aan hoofdletters.

Wil je de positie weten, gebruik dan find. De eerste gevonden positie is een index vanaf nul. Als de deeltekst ontbreekt, geeft deze methode min één terug, zodat je afwezigheid kunt onderscheiden van een vondst op het begin.

Een lege deeltekst is aanwezig en haar eerste positie is nul. Dat lijkt misschien ongewoon, maar maakt het gedrag bij lege invoer voorspelbaar. De opdrachten volgen dit gewone Python-gedrag en behandelen lege zoektekst dus niet als een fout.

Het begin apart bekijken

Een voorvoegsel is een stukje tekst aan het begin van een andere tekst. text.startswith(prefix) geeft aan of precies dat stuk vooraan staat. Een overeenkomst midden in de string is hiervoor niet genoeg.

removeprefix verwijdert één aanwezig voorvoegsel. Ontbreekt het, dan blijft de tekstwaarde hetzelfde. Deze bewerking verwijdert geen latere overeenkomsten en herhaalt het verwijderen ook niet zolang het voorvoegsel nogmaals verschijnt.

Voorspel eerst de booleans, de positie en de uiteindelijke labels. Dit voorbeeld heeft eigen gegevens en is direct uitvoerbaar.

Een label onderzoeken
label = "foto:duinen.jpg"
print("duinen" in label)
print(label.find("duinen"))
print(label.startswith("foto:"))
print(label.removeprefix("foto:"))
print(label.removeprefix("film:"))
Verwachte uitvoer
True
5
True
duinen.jpg
foto:duinen.jpg

Let op de twee manieren van zoeken: in beantwoordt alleen de aanwezigheidsvraag, find levert een positie op. Een positie in deze oorspronkelijke string verwijst naar haar codepunten. Ga je de tekst eerst veranderen, dan hoort een daarna gevonden index bij die veranderde tekst.

Veelgemaakte fout: een positie als boolean gebruiken

Een vondst op positie nul levert het getal nul op. In een if telt nul als onwaar; min één telt juist als waar. Daardoor draait de volgende foutvariant de betekenis van twee zoekresultaten om.

Nul als onwaar behandelen
label = "duinen.jpg"
if label.find("duinen"):
    print("Gevonden")
else:
    print("Niet gevonden")
Verwachte uitvoer
Niet gevonden

De zoektekst staat vooraan, maar het programma meldt toch dat zij ontbreekt. Vergelijk een zoekpositie daarom expliciet met min één wanneer je haar bestaan wilt controleren. Heb je geen positie nodig, dan is in meestal duidelijker.

Verwijder een stuk, geen verzameling tekens

Gebruik voor een voorvoegsel niet zomaar lstrip. Die methode behandelt haar argument als een verzameling losse tekens die vooraan verwijderd mogen worden. Zij kent geen complete tag die één keer moet worden weggehaald.

De opdracht remove_tag heeft juist een precies contract: verwijder de meegegeven tag één keer, alleen als hij werkelijk vooraan staat. Hoofdletters en spaties blijven betekenis houden. Een lege tag verandert niets.

Ook de andere functies zijn hoofdlettergevoelig. Maak niet op eigen initiatief alles klein en verwijder geen witruimte: daarmee zou je de aangeleverde tekst en haar posities een andere betekenis geven. Later bekijken we welke aparte afspraken je voor Unicode-vergelijkingen kunt maken.

AAN DE SLAG 0/4
1

Beantwoord de aanwezigheidsvraag

Laat contains een boolean teruggeven die aangeeft of de complete deeltekst ergens voorkomt. Houd hoofdletters betekenisvol.

2

Vind de eerste positie

Laat position de eerste index van part teruggeven, of min één als part ontbreekt. Lege zoektekst heeft positie nul.

3

Controleer alleen het begin

Laat has_prefix een boolean teruggeven die alleen waar is als prefix precies vooraan staat. Ook een leeg voorvoegsel is geldig.

4

Verwijder één complete tag

Laat remove_tag de tag één keer verwijderen als hij vooraan staat. Behoud anders alle tekst, inclusief hoofdletters en spaties.

Wat je meeneemt

  • in geeft aanwezigheid; find geeft de eerste index of min één.
  • Positie nul is een geldige vondst, ook al is nul als boolean onwaar.
  • Een voorvoegsel moet vooraan staan en kan gericht één keer worden verwijderd.

Hierna bepaal je hoe waarden worden weergegeven met veldbreedtes en precisie.

main.py
UitvoerPython
›
›_

Hier komt je resultaat.

Voer je code uit en ontdek
wat je hebt gemaakt.

0/4 stappen
EVEN MEEKIJKEN

Bekijk hoe het kan.

Je mag de oplossing bekijken. Deze poging telt dan niet mee als afgeronde les. Met Reset kun je daarna opnieuw zelf oefenen.