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 zeigt nur, was ich erreichen möchte.
any()
ist bei weitem der beste Ansatz, wenn Sie nur True
oder False
wünschen. Wenn Sie jedoch genau wissen möchten, welche Zeichenfolge (n) übereinstimmen, können Sie einige Dinge verwenden.
Wenn Sie die erste Übereinstimmung wünschen (mit False
als Standard):
match = next((x for x in a if x in str), False)
Wenn Sie alle Übereinstimmungen (einschließlich Duplikate) erhalten möchten:
matches = [x for x in a if x in str]
Wenn Sie alle nicht doppelten Übereinstimmungen erhalten möchten (Reihenfolge nicht beachtet):
matches = {x for x in a if x in str}
Wenn Sie alle nicht doppelten Übereinstimmungen in der richtigen Reihenfolge erhalten möchten:
matches = []
for x in a:
if x in str and x not in matches:
matches.append(x)
Sie sollten vorsichtig sein, wenn die Zeichenfolgen in a
oder str
länger werden. Die einfachen Lösungen nehmen O (S * (A ^ 2)) an, wobei S
die Länge von str
ist und A die Summe der Längen aller Strings in a
ist. Um eine schnellere Lösung zu finden, sehen Sie den Algorithmus Aho-Corasick für den String-Abgleich, der in linearer Zeit O (S + A) läuft.
Um nur etwas Vielfalt mitregex
hinzuzufügen:
import re
if any(re.findall(r'a|b|c', str, re.IGNORECASE)):
print 'possible matches thanks to regex'
else:
print 'no matches'
oder wenn Ihre Liste zu lang ist - any(re.findall(r'|'.join(a), str, re.IGNORECASE))
Sie müssen die Elemente von a durchlaufen.
a = ['a', 'b', 'c']
str = "a123"
found_a_string = False
for item in a:
if item in str:
found_a_string = True
if found_a_string:
print "found a match"
else:
print "no match found"
a = ['a', 'b', 'c']
str = "a123"
a_match = [True for match in a if match in str]
if True in a_match:
print "some of the strings found in str"
else:
print "no strings found in str"
jbernadas erwähnte bereits den Aho-Corasick-Algorithmus , um die Komplexität zu reduzieren.
Es gibt eine Möglichkeit, es in Python zu verwenden:
Laden Sie aho_corasick.py von hier
Legen Sie es in das gleiche Verzeichnis wie Ihre Python-Hauptdatei und nennen Sie es aho_corasick.py
.
Versuchen Sie den Alrorithmus mit dem folgenden Code:
from aho_corasick import aho_corasick #(string, keywords)
print(aho_corasick(string, ["keyword1", "keyword2"]))
Beachten Sie, dass die Suche Groß-/Kleinschreibung ist.
Es hängt vom Kontext ab Angenommen, Sie möchten einzelne Literale wie (ein einzelnes Wort a, e, w, .. usw.) in reicht aus
original_Word ="hackerearcth"
for 'h' in original_Word:
print("YES")
wenn Sie eines der Zeichen unter dem ursprünglichen_Wort prüfen möchten: verwenden Sie
if any(your_required in yourinput for your_required in original_Word ):
wenn Sie alle Eingaben, die Sie in diesem ursprünglichen_Wort wünschen, verwenden möchten, verwenden Sie all simple
original_Word = ['h', 'a', 'c', 'k', 'e', 'r', 'e', 'a', 'r', 't', 'h']
yourinput = str(input()).lower()
if all(requested_Word in yourinput for requested_Word in original_Word):
print("yes")
Ich würde diese Art von Funktion für Geschwindigkeit verwenden:
def check_string(string, substring_list):
for substring in substring_list:
if substring in string:
return True
return False
data = "firstName and favoriteFood"
mandatory_fields = ['firstName', 'lastName', 'age']
# for each
for field in mandatory_fields:
if field not in data:
print("Error, missing req field {0}".format(field));
# still fine, multiple if statements
if ('firstName' not in data or
'lastName' not in data or
'age' not in data):
print("Error, missing a req field");
# not very readable, list comprehension
missing_fields = [x for x in mandatory_fields if x not in data]
if (len(missing_fields)>0):
print("Error, missing fields {0}".format(", ".join(missing_fields)));
Weitere Informationen dazu, wie Sie alle in String verfügbaren Listenelemente erhalten
a = ['a', 'b', 'c']
str = "a123"
list(filter(lambda x: x in str, a))
Ein überraschend schneller Ansatz ist die Verwendung von set
:
a = ['a', 'b', 'c']
str = "a123"
if set(a) & set(str):
print("some of the strings found in str")
else:
print("no strings found in str")
Dies funktioniert, wenn a
keine Werte mit mehreren Zeichen enthält (in diesem Fall verwenden Sie any
wie in oben aufgeführt). In diesem Fall ist es einfacher, a
als Zeichenfolge anzugeben: a = 'abc'
.