2017-03-25 3 views
0

Ich erstelle ein Programm, das zufällige Zeichenfolgen generiert, sie in eine Liste einfügt und diese Zeichenfolgen durch eine for-Schleife ausführt, die eine Datei durchsuchen soll, um zu prüfen, ob Sie sind echte Worte oder nicht. Die Schleife ist wie folgt:Wie man eine exakte Schlüsselwort-Suchfunktion in Python macht 3

wordvalidator = open("englishwords.txt", "r") 
for line in wordvalidator: 
    for item in stringslist: 
     if item in line: 
      words.append(item) 

„englishwords.txt“ wird die Datei mit einer Vielzahl von Worten darin die zufälligen Zeichenfolge zu validieren gemeint, die als tatsächliche Worte „stringslist“ wird die Liste mit den Saiten offensichtlich, und "Wörter" sind die Liste, zu denen die Strings gehören, die als echte Wörter verifiziert wurden. Das Problem ist, dass, wenn es zum Beispiel eine Zeichenfolge gibt, sagen wir "ird", was kein echtes Wort ist, es alle Wörter durchsucht und es mit "Vogel" abgleicht. Das ist ein Problem, weil ich nicht weiß, wie man wirklich prüft, ob diese Zeichenfolgen jetzt Wörter sind. Ich weiß nicht, was ich tun soll, außer vielleicht "if item in line" durch "if item is line" zu ersetzen, was die Bedingung so ändern würde, dass sie nur dann wahr ist, wenn die Zeichenkette genau der Zeile im Dokument entspricht Ich weiß nicht, ob "ist" ein tatsächlicher Python-Begriff ist, ich weiß auch nicht, was ich sonst ähnlich gebrauchen könnte. Jede Hilfe wäre willkommen. Vielen Dank.

+0

Sie können auch "str.upper" alles, wenn Sie Groß-/Kleinschreibung Wörter haben. – tdelaney

+1

Ist in Wortvalidator nur ein Wort pro Zeile? Wenn ja, können Sie einfach 'str.strip()' und '==' - 'if item == line.strip():' verwenden. Wenn es mehr als ein Wort pro Zeile gibt, müssen Sie die Zeile str.split(), z. 'if Element in line.strip(). split():' – AChampion

+0

@tdelaney die Datei ist für diesen Zweck vollständig Großbuchstaben –

Antwort

1
with open("englishwords.txt") as wordvalidator: 
    validset = set(map(str.strip, wordvalidator)) 

words = [word for word in stringslist if word in validset] 

Grundsätzlich verwenden, um eine set, weil es schnell Mitgliedschaft Prüfung (if word in validset) der Fall ist, und verwenden Sie nicht in zu überprüfen, ob Strings gleich sind, weil es Teilzeichenfolge Suche tut, die Sie nicht wollen.

+0

str.strip funktioniert, wenn es ein Wort pro Zeile gibt. 're.findall (r '[^ \ W \ d _] +', wordvalidator.read())' würde mit mehreren Wörtern pro Zeile arbeiten. – tdelaney

+0

so würde '{Wort für Zeile in Wordvalidator für Wort in line.strip(). Split()}' ohne auf 're' zurückzugreifen. Aber das hat den Nebeneffekt, dass die gesamte Datei in den Speicher gelesen werden muss, im Gegensatz zum OP, das gerade Zeile für Zeile arbeitet. – AChampion

+0

Vielen Dank das hat funktioniert. –

Verwandte Themen