Ich habe so etwas:
extensionsToCheck = ['.pdf', '.doc', '.xls']
for extension in extensionsToCheck:
if extension in url_string:
print(url_string)
Ich frage mich, wie dies in Python eleganter wäre (ohne die for-Schleife zu verwenden). Ich habe an so etwas gedacht (wie aus C / C ++), aber es hat nicht funktioniert:
if ('.pdf' or '.doc' or '.xls') in url_string:
print(url_string)
Bearbeiten: Ich bin gezwungen zu erklären, wie sich dies von der Frage unterscheidet, die als potenzielles Duplikat markiert ist (damit es wohl nicht geschlossen wird).
Der Unterschied besteht darin, dass ich überprüfen wollte, ob eine Zeichenfolge Teil einer Liste von Zeichenfolgen ist, während die andere Frage darin besteht, zu überprüfen, ob eine Zeichenfolge aus einer Liste von Zeichenfolgen eine Teilzeichenfolge einer anderen Zeichenfolge ist. Ähnlich, aber nicht ganz gleich und Semantik ist wichtig, wenn Sie meiner Meinung nach online nach einer Antwort suchen. Diese beiden Fragen versuchen tatsächlich, das entgegengesetzte Problem voneinander zu lösen. Die Lösung für beide ist jedoch dieselbe.
quelle
Antworten:
Verwenden Sie zusammen mit einem Generator
any
, der beim ersten True kurzschließt:EDIT: Ich sehe, dass diese Antwort von OP akzeptiert wurde. Obwohl meine Lösung "gut genug" für sein spezielles Problem sein kann und eine gute allgemeine Methode ist, um zu überprüfen, ob Zeichenfolgen in einer Liste in einer anderen Zeichenfolge gefunden werden, denken Sie daran, dass dies alles ist, was diese Lösung tut. Es ist egal, wo sich die Zeichenfolge befindet, z. B. am Ende der Zeichenfolge . Wenn dies wichtig ist, wie dies häufig bei URLs der Fall ist, sollten Sie auf die Antwort von @Wladimir Palant achten, da sonst die Gefahr besteht, dass Sie falsch positive Ergebnisse erhalten.
quelle
any
, negieren einige der möglichen Vorteile, die ein Kurzschluss bietet, da in jedem Fall die gesamte Liste erstellt werden muss. Wenn Sie den Ausdruck ohne eckige Klammern (any(x.lower() in ['-?','-h','--help', '/h'] for x in sys.argv[1:])
) verwenden, wird dasx.lower() in [...]
Teil nur ausgewertet, bis ein True-Wert gefunden wurde.any()
gibt nur wahr oder falsch zurück , aber siehe @psuns Liste Verständnis Antwort unten mit dieser Änderung:print [extension for extension in extensionsToCheck if(extension in url_string)]
quelle
Es ist besser , die URL richtig zu analysieren - auf diese Weise Sie behandeln können
http://.../file.doc?foo
undhttp://.../foo.doc/file.exe
richtig.quelle
Verwenden Sie Listenverständnisse, wenn Sie eine einzeilige Lösung wünschen. Der folgende Code gibt eine Liste mit der URL-Zeichenfolge zurück, wenn sie die Erweiterungen .doc, .pdf und .xls enthält, oder gibt eine leere Liste zurück, wenn sie die Erweiterung nicht enthält.
HINWEIS: Dies dient nur zur Überprüfung, ob es enthält oder nicht, und ist nicht nützlich, wenn das genaue Wort extrahiert werden soll, das den Erweiterungen entspricht.
quelle
any
Lösung. Meiner Meinung nach ist es eine der bestmöglichen Lösungen für diese Frage.any()
meiner Meinung nach der Lösung überlegen, da er geändert werden kann, um auch den spezifischen Übereinstimmungswert zurückzugeben, wie folgt :print [extension for extension in extensionsToCheck if(extension in url_string)]
(Weitere Informationen und das Extrahieren des übereinstimmenden Wortes sowie des Musters aus der URL-Zeichenfolge finden Sie in meiner Antwort. )Überprüfen Sie, ob es zu diesem regulären Ausdruck passt:
Hinweis: Wenn sich Ihre Erweiterungen nicht am Ende der URL befinden, entfernen Sie die
$
Zeichen, sie werden jedoch leicht geschwächtquelle
Dies ist eine Variante der Listenverständnisantwort von @psun.
Durch Umschalten des Ausgabewerts können Sie das Übereinstimmungsmuster tatsächlich aus dem Listenverständnis extrahieren (was mit dem
any()
Ansatz von @ Lauritz-v-Thaulow nicht möglich ist ).Sie können außerdem einen regulären Ausdruck einfügen, wenn Sie zusätzliche Informationen sammeln möchten, sobald das übereinstimmende Muster bekannt ist (dies kann nützlich sein, wenn die Liste der zulässigen Muster zu lang ist, um in ein einzelnes Regex-Muster zu schreiben).
quelle