如果它们在字符串中,我必须检查很多世界...代码如下:
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 :(得分: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 ,它通常在评估布尔表达式时使用。
答案 1 :(得分:2)
import re
if re.search("string_1|string_2|string_n", var_strings): print True
python正则表达式的美妙之处在于它返回一个正则表达式对象(它给出了匹配的信息)或None,它可以在测试中用作“假”值。
答案 2 :(得分:2)
使用正则表达式:
import re
words = ['string_1', 'string_2', ...]
if re.search('|'.join([re.escape(w) for w in words]), var_string):
blahblah
答案 3 :(得分:1)
你看过滤镜吗?
filter( lambda x: x in var_string, ["myString", "nextString"])
然后可以与map结合使用
map( doSomething(), filter(lambda x: x in var_string, ["myString", "nextString"] ) )
编辑:
当然不能做你想要的。使用any
解决方案。出于某种原因,我认为你希望每次都这样做而不是一次。
答案 4 :(得分: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)
>>>
答案 5 :(得分: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')