Python: wie zu bestimmen, ob eine Liste von Wörtern in einem string vorhanden ist

Gegeben eine Liste ["one", "two", "three"], wie um zu bestimmen, ob jedes Wort gibt es in einer angegebenen Zeichenfolge?

Den word-Liste ist ziemlich kurz (in meinem Fall weniger als 20 Wörter), aber die strings gesucht werden, ist ziemlich groß (über 400.000 strings für jeden Lauf)

Meine aktuelle Implementierung verwendet re zu schauen, Spiele aber ich bin mir nicht sicher, ob es der beste Weg.

import re
word_list = ["one", "two", "three"]
regex_string = "(?<=\W)(%s)(?=\W)" % "|".join(word_list)

finder = re.compile(regex_string)
string_to_be_searched = "one two three"

results = finder.findall(" %s " % string_to_be_searched)
result_set = set(results)
for word in word_list:
    if word in result_set:
        print("%s in string" % word)

Probleme in meine Lösung:

  1. Wird es suchen, bis das Ende der Zeichenfolge, obwohl die Worte erscheinen in der ersten Hälfte der string
  2. Um zu überwinden die Beschränkung von lookahead-assertion (I don ' T know how to express "die Zeichen vor dem aktuellen Spiel sollten nicht-Wort-Zeichen, oder den Beginn der Zeichenfolge"), habe ich noch zusätzlichen Platz vor und nach der Zeichenfolge, die ich brauche, um gesucht werden.
  3. Andere performance-Problem, eingeführt durch die lookahead-assertion?

Möglich, eine einfachere Umsetzung:

  1. nur mit einer Schleife durch das Wort Liste und machen Sie einen if word in string_to_be_searched. Aber es kann nicht mit "Flotten Dreier", wenn Sie sind auf der Suche nach "drei"
  2. Verwenden Sie eine Suche nach regulären Ausdrücken für ein Wort. Noch bin ich nicht sicher über die Leistung und das Potenzial der Suche Zeichenfolge mehrere Male.

UPDATE:

Habe ich akzeptiert, Aaron Hall, die Antwort https://stackoverflow.com/a/21718896/683321 denn laut Peter Gibson ' s benchmark https://stackoverflow.com/a/21742190/683321 diese einfache version hat die beste Leistung. Wenn Sie daran interessiert sind dieses problem, Lesen Sie alle Antworten und einen besseren überblick bekommen.

Eigentlich habe ich vergessen zu erwähnen, die ein weiteres Hindernis in meinem ursprünglichen problem. Das Wort ist ein Satz, zum Beispiel: word_list = ["one day", "second day"]. Vielleicht sollte ich eine andere Frage stellen.

  • warum nicht einfach aufteilen, das Wort in der string_to_be_searched und legte Sie in den dict und wiederholen Wörter in der such-Liste zu bestimmen
  • dieses würde groß sein, wenn Sie hatte zu suchen, dass string_to_be_searched eine Menge, sondern der Aufbau eines Wörterbuchs in eine O(1) lookup einmal ist das nicht erstaunlich....
  • Ich glaube, dass mein regulärer Ausdruck Lösung (stackoverflow.com/questions/21718345/...) funktionieren würde für Ihre weitere Einschränkung: es ist 4-mal langsamer, auch wenn es die 2. Schnellste, aber die Schnellste Lösung würde nicht funktionieren für, die. Es ist wahrscheinlich nicht eine gute Idee, Sie zu recyceln Ihre Frage mit einer zusätzlichen Einschränkung, aber ich könnte falsch sein es.
InformationsquelleAutor yegle | 2014-02-12
Schreibe einen Kommentar