[QUIZ#1] Raubkpierer (Python)

Raubkopierer

Erfahrenes Mitglied
Code:
#!/usr/bin/python

"regular expressions modul importieren"
import re
"Datei mit Strings oeffnen und in Liste mit Strings umwandeln"
lines=open('presidents.txt').readlines()
"Suchwort abfragen"
search = str(raw_input('Was soll gesucht werden Meister? '))
def p1():
    "Methode 1"
    "Counter (zaehlt Funde) 0 setzen"
    count=0
    "fuer jeden String in der Liste Lines:"
    for word0 in lines:
        "Umbrueche am Ende entfernen falls vorhanden"
        if '\n' in word0:
            word0=word0[:-1]
        "Vervielfachen"
        word1=word0
        word2=word1
        "fuer jeden Buchstaben des Suchwortes:"
        for char in search: 
            "falls Buchstabe nicht vorhanden:"
            if word1.find(char) is -1:
                "naechster Buchstabe"
                continue
            else:
                "Buchstabe aus String entfernen um mehrfaches Finden zu verhindern"
                word2=word2[:word2.find(char)]+word1[word1.find(char)+1:]
                "Suchbereich begrenzen (Bereich vor gefundenem Buchstaben wird entfernt)"
                word1=word1[word1.find(char)+1:]
        "Abgleich ob alle Buchstaben des Suchworts im String waren indem Laenge 'nachher' und 'vorher' (abzgl. Laenge des Suchwortes) verglichen wird"
        if len(word0)-len(search) is len(word2):
            "String ausgeben"
            print word0
            "Counter um 1 erhoehen"
            count+=1 
    if count is 0:
        "Keine validen Ergebnisse registriert"
        print 'Nichts gefunden :('
def p2():
    "Methode 2 mit regexp"
    "Counter 0 setzen"
    count=0 
    "leeren String erstellen fuer neuen regexp aus Suchwort"
    search0=''
    "fuer jede Position im Suchwort (Integer):"
    for i in range(len(search)):
        "regexp-Zeichen einfuegen (beliebig viele Buchstaben zwischen diesem und naechtem Zeichen)"
        search0=search0+search[i]+'.*'
    "fuer jeden String der Liste:"
    for word in lines:
        "Umbrueche am Ende entfernen falls vorhanden"
        if '\n' in word:
            word=word[:-1]
        "regexp auf String anwenden"
        if re.search(search0, word):
            "Treffer ausgeben"
            print word
            "Counter um 1 erhoehen"
            count+=1
    if count is 0:
        "Keine validen Ergebnisse registriert"
        print 'Nichts gefunden :('
def method(exit):
    "Gewuenschte Methode waehlen lassen, exit nach x misslungenen Versuchen."
    ask=str(raw_input('Methode waehlen! [1/2] '))
    if exit is 1:
        print ('Ungueltige Eingabe, beende')
    if ask in '1':
        p1()
    elif ask in '2':
        p2()
    else:
        method(exit-1)
"Aufrufen mit 5 Versuchen"
method(5)

Ich denke die übermäßig genutzten Comments erklären alles ;)
 
Zuletzt bearbeitet:
Code:
                "Buchstabe aus String entfernen um mehrfaches Finden zu verhindern"
                word2=word2[:word2.find(char)]+word1[word1.find(char)+1:]
                "Suchbereich begrenzen (Bereich vor gefundenem Buchstaben wird entfernt)"
                word1=word1[word1.find(char)+1:]
Da machst du dir leider das Leben unnötig etwas schwer. Schau mal in die Dokumentation zur Methode find. Man kann als zweiten Parameter eine Stelle im String angeben, ab der gesucht werden soll.

Code:
        "regexp-Zeichen einfuegen (beliebig viele Buchstaben zwischen diesem und naechtem Zeichen)"
        search0=search0+search[i]+'.*'
Hier wäre '.*?' besser. Bei '.*' muss die Regex-Maschine sehr oft ein Backtracking durchführen, da der Stern standardmäßig "gierig" ist, d.h. erst mal alle Zeichen schluckt, und sie erst dann eins nach dem anderen wieder zurückgibt.

Code:
    "fuer jeden String der Liste:"
    for word in lines:
[...]
Code:
            "Counter um 1 erhoehen"
            count+=1
Solche Kommentare sind absolut unnötig, da sie keine zusätzliche Information liefern. Die beiden habe ich nur exemplarisch rausgegriffen, gibt noch ein paar andere der Art.

Ansonsten finde ich deinen Kommentierstil etwas eigenartig (Stringkonstanten). Normalerweise gibt es ja # und """...""" zur Kennzeichnung von Kommentaren.

Ändert aber natürlich nichts daran, dass die Lösung funktioniert :) Sehr schön auch, dass du zwei verschiedene Methoden implementiert hast. Schade nur, dass die Erweiterung fehlt - vielleicht magst du das ja noch nachreichen, nachdem du dich von den anderen Einsendungen inspirieren lassen hast? :)

edit: Was mir grade noch beim Durchlesen einer anderen Lösung aufgefallen ist: du verwendest die Zeichen aus dem Suchbegriff ja 1:1 in deinem regulären Ausdruck. Was passiert, wenn der Suchbegriff ein Regex-Steuerzeichen enthält? Das sollte man irgendwie abfangen, da die Suche sonst nicht mehr korrekt funktioniert.

Grüße,
Matthias

PS: Es gibt auch Code-Tags extra für Python, für Syntaxhervorhebung und so.
 
Zuletzt bearbeitet:
Ich hab dort einfach mal alles kommentiert was denn da war. In anderen Projekten werden so eindeutige Sachen eigentlich weg gelassen etc.

Wegen der Erweiterung werd ich mal schaun. Ich hatte vorhin ja schon eine Idee dazu.

An Regex-Zeichen im Ausdruck selbst habe ich noch gar nicht gedacht, da es im Beispiel selbiges nicht gab. Wäre vllt eine Idee die nächsten Aufgaben durch vorgegebenes Rohmaterial interessanter zu gestalten. Aber du hast natürlich recht und es sollte berücksichtigt werden. Bei der ersten Methode entfällt dieser Aspekt natürlich komplett.
 
Zurück