2010-08-30 6 views
8

Ich habe eine Menge von Welten zu überprüfen, ob sie in einem String sind ... Code wie folgt aussehen:Wie wird es kürzer (Pythonic)?

if "string_1" in var_string or "string_2" in var_string or "string_3" in var_string or "string_n" in var_string: 
    do_something() 

, wie es besser lesbar und klarer zu machen?

+0

regulären Ausdruck zu erreichen, (aber nicht daran erinnern, wie es in Python zu tun) – pastjean

Antwort

35

Dies ist ein Weg:

words = ['string_1', 'string_2', ...] 

if any(word in var_string for word in words): 
    do_something() 

Referenz: any()

Update:

Der Vollständigkeit halber wollen, wenn Sie die Funktion nur dann, wenn alle Wörter enthalten sind, auszuführen in die Zeichenfolge, können Sie all() anstelle von any() verwenden.

Beachten Sie auch, dass dieses Konstrukt keine unnötigen Berechnungen als any tun zurück, wenn es einen true Wert begegnet und ein generator expression verwendet wird, um die Boolesche Werte zu schaffen. Sie haben also auch eine Art von short-circuit evaluation, die normalerweise bei der Auswertung boolescher Ausdrücke verwendet wird.

+0

Danke das ist, was ich brauchte ... – Pol

+0

@Pol: Sie sollten dies als akzeptiert markieren, dann. –

1

Haben Sie Filter angeschaut?

filter(lambda x: x in var_string, ["myString", "nextString"]) 

, die dann mit Karte kombiniert werden können, um diesen

map(doSomething(), filter(lambda x: x in var_string, ["myString", "nextString"])) 

EDIT zu erhalten:

natürlich nicht, was Sie nicht tun wollen. Gehen Sie mit der any Lösung. Aus irgendeinem Grund dachte ich, du wolltest es jedes Mal und nicht nur einmal machen.

+0

Führt das nicht 'doSomething()' für irgendein Wort aus, das in der Zeichenkette ist? –

+0

Ja. Oh warte, er wollte nur einmal gemacht werden, nein? Mist. Danke, dass du darauf hingewiesen hast. – wheaties

0
>>> import re 
>>> string="word1testword2andword3last" 
>>> c=re.compile("word1|word2|word3") 
>>> c.search(string) 
<_sre.SRE_Match object at 0xb7715d40> 
>>> string="blahblah" 
>>> c.search(string) 
>>> 
+0

dies erscheint weniger knapp und weniger Python zu meinen Python Augen – marr75

+5

Definieren Pythonic? Was macht Pythonic aus? Die einzige prägnante Aussage oben ist re.compile und re.search. Der Rest zeigt nur Ausgabebeispiele. Oh, Moment mal, die Python-Interpreter-Eingabeaufforderung könnte deine Pythonic-Augen verschwimmen lassen ... – ghostdog74

2
import re 
if re.search("string_1|string_2|string_n", var_strings): print True 

Die Schönheit des Python Regex es, dass es gibt entweder ein Regex-Objekt (das gibt Informationen darüber, was angepasst) oder ohne, dass als „false“ Wert in einem Test verwendet werden kann.

2

Mit Regex das wäre:

import re 
words = ['string_1', 'string_2', ...] 

if re.search('|'.join([re.escape(w) for w in words]), var_string): 
    blahblah 
+0

Ich bin fast aufgepfiffen, weil es erfinderisch ist und Felix Kling schon so viele Upvotes hat;) Aber es scheitert, wenn einer der Strings Regex-Metazeichen enthält. – delnan

+0

Und deshalb gibt es die re.escape .... – ondra

0

eine weitere Möglichkeit, diesen check = lambda a: any(y for y in ['string_%s'%x for x in xrange(0,10)] if y in a)

print check('hello string_1')