2010-08-30 4 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

ответ

35

Это один из способов:

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

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

Ссылка: any()

Update:

Для полноты, если вы хотите, чтобы выполнить функцию, только если все слова содержатся в строку, вы можете использовать all() вместо any().

Также отметим, что эта конструкция не будет делать каких-либо ненужных вычислений, как any будет вернуться, если он встречает значение true и generator expression используется для создания логических значений. Таким образом, у вас также есть своего рода short-circuit evaluation, который обычно используется при оценке булевых выражений.

+0

Спасибо, это то, что мне нужно ... – Pol

+0

@Pol: Вы должны отметить это как принято. –

1

Вы посмотрели фильтр?

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

, которые затем могут быть объединены с картой, чтобы получить эту

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

EDIT:

, конечно, не делать то, что вы хотите. Идите с помощью решения any. По какой-то причине я думал, что вы хотите, чтобы это делалось каждый раз, а не только один раз.

+0

Не будет ли выполнять 'doSomething()' для любого слова, которое находится в строке? –

+0

Да. О, подожди, он хотел только один раз, нет? Дерьмо. Спасибо что подметил это. – 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

Это кажется менее кратким и менее питоническим для моих глаз питона. – marr75

+5

Определить Pythonic? Что делает что-то Pythonic? Единственное краткое изложение выше - re.compile и re.search. Остальные просто показывают выходные примеры. О, подождите, подсказка интерпретатора Python может размыть ваши глаза Pythonic ... – ghostdog74

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

красота питона регулярное выражение это то, что он возвращает либо регулярное выражение объекта (который дает информацию о том, что соответствует) или None, которые могут быть использованы в качестве «ложной» значением в испытании.

2

с регулярным выражением, что будет:

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

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

Я почти поддержал, потому что он изобретателен, и у Феликса Клинга уже было так много upvotes;) Но он терпит неудачу, если какая-либо из строк содержит метасимволы регулярных выражений. – delnan

+0

И вот почему есть re.escape .... – ondra

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

Смежные вопросы