# 1 # Einzelne Bücher runterladen und in 1,2,3,4 speichern. #wget "http://gutenberg.spiegel.de/buch/5560/i" -O 1.html # 2 #lynx -dump -assume_charset=UTF−8 −hiddenlinks=ignore -nolist -verbose 1.html > 1.txt # 3 # Wir geben den Inhalt von 1.txt aus und leiten ihn direkt mit > in eine Datei bibel.txt um # Die folgenden Bücher hängen wir mit Hilfe von >> an bibel.txt an #cat 1.txt > bibel.txt cat 2.txt >> bibel.txt cat 3.txt >> bibel.txt cat 4.txt >> bibel.txt # 4 import re def find_longest_word(line): word_regex = re.compile(r'\w+') longest = '' # Wir laufen durch alle Wörter von line durch (Mit Hilfe von re.findall) for word in re.findall(word_regex ,line): # Wenn das aktuelle Wort der Zeile länger ist als das bisher größte: neues größtes Wort gefunden if(len(longest) < len(word)): longest = word return longest # Wir rufen die Funktion mit einer Testzeile auf. Auf dem Bildschirm sollte "Testzeile" ausgegeben werden. testline = "Dies ist eine Testzeile" print(find_longest_word(testline)) # 5 import re def count_words(line): word_regex = re.compile(r'\w+') # re.findall ist ein Objekt, welches einen 'Eintrag' für JEDES gefundene Element des regulären Ausdrucks beinhaltet. # In unserem Fall heißt das: Ein Eintrag für jedes Wort der Zeile (wegen \w+). # Zählen wir die Anzahl der Einträge mit len(), so zählen wir in diesem Fall die Wörter. word_count = len(re.findall(word_regex ,line)) return word_count # Wir rufen die Funktion mit einer Testzeile auf. Auf dem Bildschirm sollte 4 ausgegeben werden. testline = "Dies ist eine Testzeile" print(count_words(testline)) # 6a import re splitregex = re.compile(r'\w+') bibel = open('bibel.txt', 'r') frequenzliste = {} for line in bibel: # Unser regulärer Ausruck findet alle Wörter der Zeile und läuft durch diese einzeln durch. for word in re.findall(splitregex,line): # Entfernt Komma, Punkt, etc. vom Wort word = word.strip() # Frequenzliste wie üblich erstellen. if (word in frequenzliste): frequenzliste[word] = frequenzliste[word] + 1 else: frequenzliste[word] = 1 # Filestream schließen bibel.close() print('In der Datei kamen', len(frequenzliste),'unterschiedliche Wörter vor.') # 6b # Frequenzliste wie oben erstellen import re splitregex = re.compile(r'\w+') bibel = open('bibel.txt', 'r') frequenzliste = {} for line in bibel: for word in re.findall(splitregex,line): word = word.strip() if (word in frequenzliste): frequenzliste[word] = frequenzliste[word] + 1 else: frequenzliste[word] = 1 bibel.close() # Wir sortieren die Frequenzliste nach ihrem Wert absteigend - ACHTUNG, das Ergebnis ist kein Dictionary mehr, sondern eine Liste mit Tupeln frequenzliste = sorted(frequenzliste.items(), key=lambda x: x[1], reverse = True) # Wir legen eine leere Liste an, in der die Zehn häufigsten groß geschriebenen Wörter gespeichert werden most_occurences = [] # Wir lassen uns alle Elemente (Wort, Anzahl) der sortierten Liste ausgeben for element in frequenzliste: # Wir wollen nur weitere Wörter suchen/anhängen, wenn in der Liste noch nicht 10 Wörter gespeichert sind if len(most_occurences) < 10: # Prüfen, ob das aktuelle Wort groß geschrieben ist - ansonsten machen wir nichts mit dem Wort if element[0].istitle(): # Wort der Liste anhängen most_occurences.append(element[0]) # Liste ausgeben print("Dies sind zehn häufigsten großgeschriebenen Wörter: \n", most_occurences) # 6c # Frequenzliste wie oben erstellen import re splitregex = re.compile(r'\w+') bibel = open('bibel.txt', 'r') frequenzliste = {} for line in bibel: for word in re.findall(splitregex,line): word = word.strip() if (word in frequenzliste): frequenzliste[word] = frequenzliste[word] + 1 else: frequenzliste[word] = 1 bibel.close() # Wir sortieren die Frequenzliste nach ihrem Wert absteigend - ACHTUNG, das Ergebnis ist kein Dictionary mehr, sondern eine Liste mit Tupeln frequenzliste = sorted(frequenzliste.items(), key=lambda x: x[1], reverse = True) # Wir legen eine leere Liste an, in der die Zehn am öftesten vorkommenden klein geschriebenen Wörter gespeichert werden most_occurences = [] for element in frequenzliste: if len(most_occurences) < 10: # Prüfen, ob das aktuelle Wort klein geschrieben ist - ansonsten machen wir nichts mit dem Wort if not element[0].istitle(): # Wort der Liste anhängen most_occurences.append(element[0]) # Liste ausgeben print("Dies sind zehn häufigsten klein geschriebenen Wörter: \n", most_occurences) ##Aufgabe 11-7## #!/usr/bin/python3 import re buchregex = re.compile(r'^\d+\. Buch \w+') # matcht Zeilen, die mit einer Zahl, dem Wort "Buch" und noch einem Wort beginnen kapitelregex = re.compile(r'^Kapitel \d+') # matcht Zeilen, die mit dem Wort "Kapitel" und einer Zahl beginnen versregex = re.compile(r'^ (\d+)') # matcht Zeilen, die mit 3 spaces und einer Zahl beginnen emptylineregex = re.compile(r'^\s*$') # matcht Zeilen, die leer sind oder nur Whitespaces enthalten filebibel = open('bibel.txt', 'r') # öffnet die Datei zum lesen bibel = filebibel.readlines() vers_zuende = False # Boolvariable, wird auf True gesetzt, sobald die letzte Zeile Beginn eines Verses war for line in bibel: # iteriert über die Zeilen der Datei if re.search(buchregex, line): print(line) # wird eine Buchüberschrift gefunden, wird die Zeile ausgegeben elif re.search(kapitelregex, line): print (line) # wird eine Kapitelüberschrift gefunden, wird die Zeile ausgegeben elif re.search(versregex, line): match = re.findall(versregex, line)[0] # erstellt eine Liste aller Matches und speichert das erste Match in der Variablen "match" if (int(match) <= 3): # wenn der Zahlenwert der Variablen "match" höchstens 3 ist, wird die Zeile ausgegeben und die Boolvariable auf True gesetzt print(line) vers_zuende = True elif vers_zuende: # wird nur ausgeführt, wenn die Zeile auf keinen der Regex passt und die Boolvariable True ist if not re.search(emptylineregex, line): # wenn die Zeile nach dem Versanfang nicht leer ist, wird sie ausgegeben, weil sie zum Vers gehört print(line) else: # eine Leerzeile merkiert das Ende des Verses, wird also nicht mit ausgegeben vers_zuende = False # die Boolvariable wird auf False gesetzt und damit die Schleife beendet filebibel.close() ##Aufgabe11-8## #!/usr/bin/python3 import re bibelfile = open('bibel.txt', 'r') bibel = bibelfile.read() sohn_regex = re.compile(r'(\w+), der Sohn (\w+)s') # matcht das Pattern "Name1, der Sohn Name2s" # beide Namen werden gruppiert, um separat auf sie zugreifen zu können vater_von = {} #legt ein leeres Dictionary an, in dem der Name des Sohns als Key und der Name des Vaters als Value gespeichert werden soll for match in re.findall(sohn_regex, bibel): # erstellt mit re.findall eine Liste aller Matches und iteriert darüber vater_von[match[0]] = match[1] # greift auf die beiden Gruppen zu und hinterlegt den Namen des Sohnes als Key, den Namen des Vaters als Value im Dictionary anzahl_sohn = {} # legt ein Dictionary an, in das in Form einer Frequenzliste füt jeden Vater die Anzahl der Söhne eingetragen wird for sohn, vater in vater_von.items(): # iteriert durch die keys und values des Dictionarys if vater in anzahl_sohn: anzahl_sohn[vater] += 1 # ist der Vater bereits in der Frequenzliste, wird der Value erhöht else: anzahl_sohn[vater] = 1 meiste_soehne = 0 # Variable, um einen Vergleich mit der Frequenzliste durchführen zu können for vater, sohn in anzahl_sohn.items(): if sohn > meiste_soehne: # wenn der aktuelle Value größer ist als meiste_kinder meiste_soehne = sohn # die Variable erhält den Wert des aktuellen Values gewinner_vater = vater # der aktuelle Key wird in einer neuen Variablen gespeichert print("Der Vater mit den meisten Söhnen ist:", gewinner_vater, "mit",meiste_soehne,"Söhnen:") # der Name des Vaters mit dem höchsten Score wird ausgegeben, sowie der Score selbst for sohn in vater_von.keys(): # alle Namen der Söhne ausgeben if vater_von[sohn] == gewinner_vater: print(" -",sohn) ##Aufgabe 11-9## #!/usr/bin/python3 import re def shortest_word(line): # definiert die Funktion "shortest_word" mit dem Argument "line" splitregex = re.compile(r'\w+') sort_wörter = sorted(re.findall(splitregex, line), key=lambda x: len(x)) # erstellt eine Liste mit allen Matches und sortiert sie nach der Länge return sort_wörter[0] # gibt das erste Element zurück testline = "Computerlinguistik LMU Student Computer Informatik" print ('Das kürzseste Wort der Testzeile ist:"',shortest_word(testline),'".') # gibt den Rückgabewert der Funktion aus