← Python/Tekst begrijpen en verwerken
Les 8 van 8
MODULE 05 · 08◷ 35 min

Lees materiaalregels en behoud de afwijzingen

Na deze les kun je
  • Splitsen, normaliseren en herkennen combineren
  • Geldige records en afgewezen invoer apart teruggeven
  • Volgorde en onafhankelijke dictionaries behouden

Een lijst materiaal komt binnen als tekstregels met een naam en een aantal. Sommige regels zijn onbruikbaar, maar de goede gegevens wil je wel bewaren. Je bouwt daarom een kleine parser die beide uitkomsten zichtbaar houdt.

Van tekstregel naar gegevens

Een parser zet tekst met een afgesproken vorm om in gegevens waarmee je programma verder kan werken. Hier is de vorm eenvoudig: een naam, één puntkomma en een niet-negatief geheel aantal. Het gaat om dit kleine formaat; aanhalingstekens en puntkomma's binnen namen ondersteunen we niet.

parse_row maakt eerst onderdelen met split(";"). Er moeten precies twee velden zijn. Met strip verwijder je witruimte aan de buitenkant van elk veld, zodat een spatie rond de puntkomma geen extra betekenis krijgt.

Een ontbrekende naam maakt de regel ongeldig. Normaliseer een geldige naam daarna naar NFC, met behoud van hoofdletters en eventuele spaties binnen de naam. Daarmee gebruik je de afspraak uit de eerdere Unicode-les opnieuw.

Eerst herkennen, dan omzetten

Het aantal mag alleen uit één of meer ASCII-cijfers bestaan. Gebruik bijvoorbeeld re.fullmatch(r"[0-9]+", amount): de plus betekent één of meer keer het vorige onderdeel. Een minteken, lege waarde of andere cijferreeks past dus niet.

Na die controle zet int het aantal om in een getal. Voorloopnullen mogen: de tekst 007 wordt het getal zeven. Geef de dictionary met de sleutels name en units terug, of None als de regel niet aan de afspraken voldoet.

Houd afgewezen regels zichtbaar

parse_batch verwerkt meerdere regels en gebruikt daarvoor parse_row. Met splitlines verdeel je de tekst ook wanneer regels met een Windows-regeleinde eindigen. Sla volledig lege regels en regels met alleen witruimte over.

Voeg geldige dictionaries in hun oorspronkelijke volgorde aan een lijst toe. Bewaar ongeldige regels in een tweede lijst, precies zoals ze binnenkwamen. Geef beide lijsten samen als tuple terug, zodat de aanroeper kan besluiten wat er met de afwijzingen gebeurt.

Dit zelfstandige voorbeeld gebruikt instellingen met een gelijkteken. Voorspel de twee verzamelingen: de bruikbare waarden en de regel waarvoor geen waarde kon worden gelezen.

Bruikbare instellingen en afgewezen regels
settings = " kleur = groen\n\ngeen-keuze\nvorm = rond"
values = {}
rejected = []
for line in settings.splitlines():
    if not line.strip():
        continue
    parts = line.split("=", 1)
    if len(parts) != 2 or not parts[0].strip():
        rejected.append(line)
    else:
        values[parts[0].strip()] = parts[1].strip()
print(values)
print(rejected)
Verwachte uitvoer
{'kleur': 'groen', 'vorm': 'rond'}
['geen-keuze']

Het voorbeeld en de opdrachten gebruiken hetzelfde idee van twee uitkomsten, maar verschillende tekstformaten. Voor de materiaalregels moet je ook het aantal controleren, een integer maken en de naam normaliseren. Werk die verantwoordelijkheid eerst in de kleine functie uit voordat je meerdere regels doorloopt.

Veelgemaakte fout: slechte regels verdwijnen

Alleen goede regels verzamelen lijkt handig. De aanroeper kan dan echter niet zien dat een deel van de invoer is overgeslagen. Voer de foutvariant uit en controleer welke aangeleverde regel nergens meer terugkomt.

Een ongeldige regel verdwijnt
records = []
for line in ["Noord:8", "kapot"]:
    parts = line.split(":")
    if len(parts) == 2:
        records.append(parts)
print(records)
Verwachte uitvoer
[['Noord', '8']]

De kapotte regel is verdwenen. Een lijst met afgewezen regels voorkomt dat dit verlies onzichtbaar blijft. Bewaar daarin ook de oorspronkelijke spaties; die kunnen later helpen om te begrijpen wat er fout ging.

Ieder record houdt eigen gegevens

Maak voor iedere geldige regel een eigen dictionary. Twee gelijke namen mogen twee aparte records opleveren; gebruik de naam dus niet als unieke sleutel voor de hele lijst. Een wijziging aan één resultaatrecord mag een ander record niet mee veranderen.

AAN DE SLAG 0/4
1

Maak een getypeerd materiaalrecord

Laat parse_row een dictionary met name als NFC-string en units als niet-negatieve integer teruggeven. Voorloopnullen in het aantal mogen.

2

Controleer grenzen en ontbrekende velden

Laat parse_row buitenste witruimte verwijderen en bij een ontbrekende naam, verkeerde veldtelling of ongeldig aantal None teruggeven. Alleen ASCII-cijfers tellen.

3

Verzamel records én de oorspronkelijke afwijzingen

Laat parse_batch een tuple met records en afgewezen regels teruggeven. Behoud de volgorde, sla lege regels over en bewaar ongeldige regels ongewijzigd.

4

Houd resultaatrecords onafhankelijk

Laat parse_batch ook gelijke namen als aparte records bewaren. Ieder record en iedere nieuwe aanroep moeten onafhankelijke resultaatlijsten opleveren.

Wat je meeneemt

  • Een parser voert een expliciet afgesproken tekstformaat stap voor stap uit.
  • Controleer een getaltekst voordat je haar omzet en houd afwijzingen apart.
  • Resultaten blijven in volgorde en ieder record krijgt een eigen dictionary.

Hierna leer je fouten opvangen en begrijpelijk doorgeven wanneer een functie echt moet stoppen.

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.