如果substring in string,则substring有多个值

时间:2014-06-13 19:52:57

标签: python string substring

我知道有办法解决这个问题,但我想了解为什么这不起作用的基本逻辑。

这是一个非常简单的语句,只有在"或列表中的第一个子字符串时才会返回True。显示。

for i in list:
    if (substring1 or substring2 or substring3) in string:
        print(string + " found!")

我在这里缺少什么?如果在字符串中找到任何子字符串,我认为或条件将等于true。如果在字符串中找到substring1而没有substring2或substring3,我只会出现为真。

5 个答案:

答案 0 :(得分:5)

substring1 or substring2 or substring3

假设substring1不是空字符串,则此表达式的计算结果为substring1,因为substring1是真实的。然后检查它是否在string中。其他子串对声明没有影响。

换句话说,在or之前评估in,并且or评估它找到的第一个真值(这称为短路)。您不能以in方式检查多个子字符串是否在字符串中。

你想:

substring1 in string or substring2 in string or substring3 in string

或者:

substrings = (substring1, substring2, substring3)
if any(s in string for s in substrings):

答案 1 :(得分:3)

>>> string = 'hello'
>>> s1 = 'he'
>>> s2 = 'll'
>>> s3 = 'o'
>>> (s1 or s2 or s3)
'he'
>>> 'he' in string
True

这里的问题是,您首先评估(s1 or s2 or s3),如果s1未评估为s1,则会false。在布尔上下文中,空字符串计算为false

>>> s1 = ''
>>> (s1 or s2 or s3)
'll'

你想要的是s1 in string or s2 in string or s3 in string,如果字符串中至少有一个子字符串,这将返回true。

答案 2 :(得分:1)

因为python使用延迟评估...例如......

def error():
    raise ArithmeticError

print "nothing" or error()

将打印"没有"因为它在python代码中计算为True不会检查错误,这通常会引发错误并阻止脚本继续...

print False or error() #raises error and breaks script
(substring1 or substring2 or substring3) #returns the first true value

答案 3 :(得分:1)

正确的代码应该是

for i in list:
    if (substring1 in i ) or (substring2 in i) or (substring3 in i):
        print(i + " found!")

上面的代码可以在有多个值时找到子字符串。

(substring1 or substring2 or substring3)

此表达式将返回括号中非空的第一项。 例如,如果subtring1不为null,则返回substring1的值。 当substring1不为null时,

(substring1 or substring2 or substring3) 

等于

substring1

答案 4 :(得分:0)

您可能需要any

if any(substr in string for substr in substrs):
  # At least one match