2010-08-30 69 views
8

我得查了很多的世界,如果他們在串...代碼如下所示:如何縮短(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() 

如何使它更具可讀性和更清晰?

+0

正則表達式,(但不記得如何做到這一點在Python) – pastjean 2010-08-30 13:38:51

回答

35

這是一種方式:

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

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

參考:any()

更新:

爲了完整起見,如果要執行只有所有字包含的功能字符串,您可以使用all()而不是any()

另請注意,此構造不會做任何不必要的計算,因爲any將返回,如果它遇到true值和generator expression用於創建布爾值。所以你也有一些在計算布爾表達式時通常使用的short-circuit evaluation

+0

感謝那就是我所需要的... – Pol 2010-08-30 13:46:11

+0

@Pol:那麼你應該把這個標記爲接受,然後。 – 2010-08-30 14:33:15

1

你看過濾器嗎?

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

然後可以與地圖相結合,得到這個

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

編輯:

當然

你想要什麼,不辦。使用any解決方案。出於某種原因,我認爲你每次都想完成它,而不是一次。

+0

不會爲字符串中的任何單詞執行'doSomething()'嗎? – 2010-08-30 14:05:17

+0

是的。哦,等等,他只想做一次,不是嗎?廢話。感謝您指出了這一點。 – wheaties 2010-08-30 14:28:32

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

這似乎不太簡潔,python的pythonic少 – marr75 2010-08-30 13:58:26

+5

Define Pythonic?什麼使Pythonic變成了什麼?上面唯一簡潔的語句是re.compile和re.search。其餘的只是顯示輸出示例。哦,等等,Python解釋器的提示可能會模糊你的Pythonic眼睛... – ghostdog74 2010-08-30 14:15:39

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

蟒正則表達式的優點它它返回無論是正則表達式對象(即給出什麼匹配信息)或無,其可以用作在測試一個「假」值。

2

用正則表達式,這將是:

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

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

我差點提高,因爲它的創造性和Felix Kling已經有這麼多upvotes;)但是如果任何字符串包含正則表達式元字符,它就會失敗。 – delnan 2010-08-30 15:04:19

+0

這就是爲什麼有re.escape .... – ondra 2010-08-30 16:44:53

0

另一種方式來實現這一 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')