Wie kann ich überprüfen, ob eine der Zeichenfolgen in einem Array in einer anderen Zeichenfolge vorhanden ist?
Mögen:
a = ['a', 'b', 'c']
str = "a123"
if a in str:
print "some of the strings found in str"
else:
print "no strings found in str"
Dieser Code funktioniert nicht, er soll nur zeigen, was ich erreichen möchte.
[abc]
funktioniert auch perfekt und ist schneller, wenn mehr als ein paar Kandidaten getestet werden müssen. Wenn die Zeichenfolgen jedoch beliebig sind und Sie sie nicht im Voraus kennen, um einen regulären Ausdruck zu erstellen, müssen Sie denany(x in str for x in a)
Ansatz verwenden.Antworten:
Sie können verwenden
any
:Verwenden Sie anstelle von , um zu überprüfen, ob alle Zeichenfolgen aus der Liste gefunden wurden .
all
any
quelle
for x in a
wie "für jedes Element in der Liste" lesen . Daa
es sich um eine Liste von Zeichenfolgen handelt undx
ein Element dieser Liste ist,x
handelt es sich um eine Zeichenfolge (im ursprünglichen Beispiel eine von 'a', 'b', 'c')any()
ist bei weitem der beste Ansatz, wenn alles , was Sie wollen,True
oder istFalse
, aber wenn Sie genau wissen möchten, welche Zeichenfolge / Zeichenfolgen übereinstimmen, können Sie ein paar Dinge verwenden.Wenn Sie die erste Übereinstimmung wünschen (
False
standardmäßig mit):Wenn Sie alle Übereinstimmungen (einschließlich Duplikate) erhalten möchten:
Wenn Sie alle nicht doppelten Übereinstimmungen erhalten möchten (ohne Berücksichtigung der Reihenfolge):
Wenn Sie alle nicht doppelten Übereinstimmungen in der richtigen Reihenfolge erhalten möchten:
quelle
OrderedDict
ist wahrscheinlich leistungsfähiger als eine Liste. Siehe diese Antwort unter "Entfernen von Duplikaten in Listen"Sie sollten vorsichtig sein , wenn die Strings in
a
oderstr
länger werden. Die einfachen Lösungen nehmen O (S * (A ^ 2)), wobeiS
die Länge vonstr
und A die Summe der Längen aller Strings in ista
. Eine schnellere Lösung finden Sie im Aho-Corasick- Algorithmus für die Zeichenfolgenanpassung, die in der linearen Zeit O (S + A) ausgeführt wird.quelle
Nur um etwas Abwechslung zu schaffen mit
regex
:oder wenn Ihre Liste zu lang ist -
any(re.findall(r'|'.join(a), str, re.IGNORECASE))
quelle
(
oder*
dies nicht gelingt, da unter Angabe für die regex Syntax getan werden muss.'|'.join(map(re.escape, strings_to_match))
. Sie sollten wahrscheinlichre.compile('|'.join(...))
auch.Sie müssen die Elemente von a iterieren.
quelle
jbernadas erwähnte bereits den Aho-Corasick-Algorithmus , um die Komplexität zu reduzieren.
Hier ist eine Möglichkeit, es in Python zu verwenden:
Laden Sie hier aho_corasick.py herunter
Legen Sie es in dasselbe Verzeichnis wie Ihre Python-Hauptdatei und benennen Sie es
aho_corasick.py
Versuchen Sie den Alrorithmus mit dem folgenden Code:
Beachten Sie, dass bei der Suche zwischen Groß- und Kleinschreibung unterschieden wird
quelle
quelle
Es hängt vom Kontext nehme an, wenn Sie einzelne wörtliche überprüfen , wie wollen (ein beliebiges Wort, e, w, .. etc) in genügt
Wenn Sie eines der Zeichen im Originalwort überprüfen möchten, verwenden Sie
Wenn Sie alle Eingaben in diesem Originalwort wünschen, verwenden Sie alle einfachen
quelle
Nur ein paar Infos, wie man alle Listenelemente in String verfügbar macht
quelle
Ein überraschend schneller Ansatz ist
set
:Dies funktioniert, wenn
a
keine Werte mit mehreren Zeichen enthalten sind (in diesem Fallany
wie oben aufgeführt ). Wenn ja, ist es einfacher,a
als Zeichenfolge anzugeben :a = 'abc'
.quelle
quelle
Ich würde diese Art von Funktion für die Geschwindigkeit verwenden:
quelle
quelle