Deze opdrachten zijn onderdeel van een programmeercursus gegeven in de opleiding Informatiekunde van de Rijksuniversiteit Groningen.
Opdracht 3.1
Het Pythonprogramma hieronder leest een regel met tekst en laat vervolgens de woorden en leestekens van deze tekst op aparte regels zien. Lees het programma en probeer alle onderdelen te begrijpen. Breid dit programma uit zodanig dat:
- het geen lege regels meer laat zien als de ingetikte regel begint of eindigt met spaties
- het tenminste drie andere leestekens kan herkennen en goed verwerken (naast de punt en komma)
# laad de instructie sub uit het pakket re from re import sub # begin met een tekst in de variabele regel regel = "nietleeg" # herhaal zolang regel niet leeg while regel != "": # lees een regel van het toetsenbord regel = input("tik een regel tekst in: ") # verwerk regel indien niet leeg if regel != "": # plaats spaties om leestekens regel = sub("([.,])",r" \1 ",regel) # vervang alle spaties door newlines en print regel = sub(" +","\n",regel) print("dit zijn de woorden:\n",regel,sep="")
Een voorbeeld van de interactie met een verbeterde versie van het programma:
$ python3 31.py tik een regel tekst in: zoals: 'begin' en 'end' (bij Pascal), of accolades '{' dit zijn de woorden: zoals : ' begin ' en ' end ' ( bij Pascal ) , of accolades ' { ' tik een regel tekst in:
Opdracht 3.2
Pas het programma van opdracht 3.1 aan zodanig dat het zinsgrenzen kan herkennen. Het programma leest weer een regel tekst vanaf het toetsenbord en laat dan de volgende uitvoer zien:
- elke zin van de regel wordt op een aparte regel geplaatst
- alle woorden en leestekens van elke zin worden gescheiden door steeds precies 1 spatie
- een zin in de uitvoer mag niet beginnen of eindigen met een spatie
- de punt, het uitroepteken en het vraagteken kunnen worden herkend als zinsgrenzen
Hier is een voorbeeld van interactie met het programma:
$ python3 32.py tik een regel met zinnen in: test 1. test 2? test 3! dit zijn de zinnen: test 1 . test 2 ? test 3 ! tik een regel met zinnen in:
Opdracht 3.3
Pas het programma van opdracht 3.1 aan zodanig dat het specifieke groepen woorden kan herkennen (verander wel eerst het inputcommando in input(""): we hebben de prompttekst niet nodig). Maak aparte versies voor het herkennen van:
- woorden met een minimumlengte van 1 teken die alleen de letters a en h bevatten: 0 keer of vaker, in willekeurige volgorde, zonder onderscheid te maken tussen hoofd- en kleine letters
- woorden die beginnen met 1 of meer p's en verder alleen 1 of meer de letter f bevatten (zonder onderscheid te maken tussen hoofd en kleine letters)
- woorden van vier of meer tekens die geen verschillende tekens bevatten (dus bijvoorbeeld alleen maar de letter x)
Gebruik reguliere expressies voor het herkennen van de woordgroepen. Hier is een codevoorbeeld:
# de variabele regel bevat woorden en leestekens gescheiden door spaties m = search(" (abc) ",regel) # zoek naar abc in regel if m: # print resultaat (indien gevonden) print(m.group(1))
Voeg deze code toe aan het programma van opdracht 3.1 en vervang abc door een geschikte reguliere expressie.
Pas het programma toe op het bestand 2011050912.txt.gz (teksten van Twitter van maandag 9 mei 2011, 12:00-12:59) en gebruik het Linuxprogramma wc om te tellen hoeveel woorden het programma heeft gevonden. Voorbeeld van de interactie met het programma:
$ gunzip -c 2011050912.txt.gz | python3 33a.py 2>/dev/null | wc -l 4244 $ gunzip -c 2011050912.txt.gz | python3 33a.py 2>/dev/null | head Haha Aah haha hahaha Ahahahahah Hahahah hahha a hahahah Hahah $ gunzip -c 2011050912.txt.gz | python3 33b.py 2>/dev/null | wc -l 492 $ gunzip -c 2011050912.txt.gz | python3 33c.py 2>/dev/null | wc -l 160
Opmerking 1: de instructie input geeft een foutmelding bij het lezen van bestanden. Een robuustere methode is het inlezen van regels met behulp van stdin uit het pakket sys:
from sys import stdin for regel in stdin: # leest steeds 1 regel en plaatst deze print(regel) # in de variabele regel
Vervang print(regel) in dit voorbeeld door jouw eigen code. Hou er rekening mee dat deze methode de newline-tekens aan het eind van de regel behoudt: deze komen in de stringvariabele. Gebruik de instructie str.strip om deze eventueel te verwijderen.
Opmerking 2: bij de derde reguliere expressie is het nodig om een r voor de zoekexpressie te plaatsen (bijvoorbeeld: r" (abc) "). De r staat voor "raw". Het zorgt ervoor dat Python strings met backslashes niet interpreteert (normaal worden intern de backslashes uit strings verwijderd).
Let op: voor deze opdracht moet je drie programma's en drie testresultaten inleveren. De programma's lijken op elkaar, alleen de gebruikte reguliere expressie is anders.
Opdracht 3.4
Het bestand 2011050912.txt.gz bevat Twitterberichten verzonden op maandag 9 mei 2011, 12:00-12:59. Het bestand bevat 1 bericht per regel. Voor elk bericht staat de naam van de verzender gevolgd door een spatie, bijvoorbeeld: "Jan Het regent alweer.".
Schrijf een Pythonprogramma dat bepaalt hoe lang de langste gebruikersnaam is, hoe lang het langste bericht is en hoe vaak namen en berichten van deze lengte voorkomen in het bestand.
Hier is een voorbeeld van het draaien van het programma:
$ gunzip -c 2011050912.txt.gz | python3 34.py langste gebruikersnaam: 15 letters (2855x gevonden) langste bericht: 164 letters (2x gevonden)
Lever jouw programma's, testresultaten en antwoorden op vragen in op Nestor samengevoegd in 1 tekstbestand met naam studentnummer-weeknummer.txt, bijvoorbeeld s1234567-3.txt, voor maandag 16 mei 2011, 12:00.
Antwoorden
Last update: May 09, 2011. erikt(at)xs4all.nl