【问题标题】:Substring search in PythonPython中的子字符串搜索
【发布时间】:2017-02-03 18:19:05
【问题描述】:

我想了解以下语句的工作原理:

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

这似乎类似于:

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

这两种说法有什么区别吗?谢谢!

【问题讨论】:

  • “我想了解以下语句的工作原理” - 它没有。在connection_type"ssh" 中尝试"telnet",而不是在connection_type 中。

标签: python string substring


【解决方案1】:

是的,有区别。

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

>>> 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):
    ...

【讨论】:

    【解决方案2】:

    它不起作用的原因是括号中的“或”语句 首先执行给定内任何内容的优先级 括号。由于两个操作数都是字符串,所以它们都是 在 python 中计算为真。但是返回的是实际值 如果你运行,你可以看到它本身:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      相关资源
      最近更新 更多