Python中的子串搜索

时间:2017-02-03 18:19:06

标签: python string substring

我想了解以下声明的工作原理:

if ("ssh" or "telnet") in connection_type:
 ...

这似乎与以下内容类似:

if any(substr in connection_type for substr in ["ssh", "telnet"]):
...

这两个陈述之间有什么区别吗?谢谢!

2 个答案:

答案 0 :(得分:3)

是的,有区别。

第一个似乎有效,但没有。

>>> connection_type = 'ssh'
>>> ("ssh" or "telnet") in connection_type
True

>>> connection_type = 'telnet'
>>> ("ssh" or "telnet") in connection_type
False

这是为什么? Python中的or运算符返回操作数中的第一个True值,如果所有操作数都计算为False,则返回最后一个值 - 这就是它仅适用于“ssh”的原因。您可以将or视为其他语言的三元运算符:

first or second

就像:

bool(first) ? first : second

第二个是对的。

如果connection_type是“telnet”或“ssh”这个词,你也可以这样做:

if connection_type in ('ssh', 'telnet'):
    ...

如果“telnet”或“ssh”只是connection_type的子字符串,您还可以使用正则表达式:

if re.search(r'ssh|telnet', connection_type):
    ...

答案 1 :(得分:0)

它不起作用的原因是括号内的'或'声明 在给定内部任何内容的优先级的情况下首先执行 括号。因为两个操作数都是字符串,所以它们都是 在python中评估为true。但返回的是实际值 如果你跑,你可以看到它自己:

a=("ssh" or "telnet")
print(a)

你会得到" ssh"。这种行为被称为"短路" 从而在'或'中获得第一个真正的价值。遇到 返回(类似于'和'语句中的第一个错误值 将被退回)。一些也这样做的语言将返回这个真实的' 将其转换为实际布尔值的值(参见here) - 但不是在蟒蛇的情况下。

所以你每次都会获得第一个操作数,除非该值得到评估 在python的规则下为false(参见this) 这就是用于后续" in"的价值。 声明 - 因而也是不直观的行为。