655 Stimmen

Prüfen, ob mehrere Zeichenfolgen in einer anderen Zeichenfolge vorhanden sind

Wie kann ich überprüfen, ob eine der Zeichenfolgen in einem Array in einer anderen Zeichenfolge vorhanden ist?

Wie:

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 will.

1271voto

Mark Byers Punkte 761508

Sie können verwenden any :

a_string = "A string is more than its parts!"
matches = ["more", "wholesome", "milk"]

if any(x in a_string for x in matches):

In ähnlicher Weise wird geprüft, ob todo die Zeichenketten aus der Liste gefunden werden, verwenden Sie all 代わりに any .

119voto

zondo Punkte 19032

any() ist bei weitem der beste Ansatz, wenn Sie nur Folgendes wollen True o False Wenn Sie aber genau wissen wollen, welche Zeichenkette(n) übereinstimmen, können Sie einige Dinge verwenden.

Wenn Sie den ersten Treffer (mit False als Standard):

match = next((x for x in a if x in str), False)

Wenn Sie alle Treffer (einschließlich der Duplikate) erhalten möchten:

matches = [x for x in a if x in str]

Wenn Sie alle nicht-duplizierten Übereinstimmungen erhalten möchten (ohne Berücksichtigung der Reihenfolge):

matches = {x for x in a if x in str}

Wenn Sie alle nicht-duplizierten Treffer in der richtigen Reihenfolge erhalten möchten:

matches = []
for x in a:
    if x in str and x not in matches:
        matches.append(x)

67voto

jbernadas Punkte 2432

Sie sollten vorsichtig sein, wenn die Zeichenketten in a o str wird länger. Die einfachen Lösungen benötigen O(S*(A^2)), wobei S ist die Länge von str und A ist die Summe der Längen aller Zeichenketten in a . Eine schnellere Lösung finden Sie unter Aho-Corasick Algorithmus für String-Matching, der in linearer Zeit O(S+A) läuft.

43voto

Shankar ARUL Punkte 11009

Nur um etwas Abwechslung in die regex :

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))

19voto

Berislav Lopac Punkte 15229

Ein erstaunlich 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 mehrstelligen Werte enthält (verwenden Sie in diesem Fall any wie aufgelistet über ). Wenn ja, ist es einfacher, Folgendes anzugeben a als Zeichenkette: a = 'abc' .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X