【问题标题】:How do regex objects work in Python loops?正则表达式对象如何在 Python 循环中工作?
【发布时间】:2021-04-27 05:01:45
【问题描述】:

我正在 Python 上构建一个 if 语句,当正则表达式的 match 函数发现巧合时打印一些东西。我想知道为什么当我的语句的条件不是布尔值时 if 语句有效(我认为是这样)。

import re

coincidence = re.match(r'\w{3}', 'abc')

if coincidence:
  print('There\'s a match')

产生:

"There's a match"

为什么会起作用?

【问题讨论】:

  • 没有“if 循环”。 if 不循环。
  • 你是对的。我会改的。

标签: python python-3.x regex if-statement


【解决方案1】:

当使用re.match() 找到匹配项时,将返回re.match() 对象。在你的情况下,这是;

<re.Match object; span=(0, 3), match='abc'>

这意味着变量coincidence 具有一个值,当bool() 转换时返回True

bool(coincidence)
True

如果未找到匹配项,则返回None,它始终等同于False

coincidence = re.match(r'\w{5}', 'abc')
print(coincidence)
#None
bool(coincidence)
#False

您的语句归结为is coincidence True,它在返回对象时等于True

【讨论】:

  • 很好的解释。如果我理解正确的话,if 语句的参数类型转换为 bool,这是原始问题的关键。
  • 强制转换为布尔值仅发生在 if 语句中。否则,您需要bool。例如。当coincidence 不是空类型时,bool(coincidence) is True 将返回True
【解决方案2】:

Python 类型具有关联的“真实性”值。您可以通过在不同的对象上执行bool() 来尝试一下。最明显的例子是整数:

bool(1)

> True

bool(0)

> False

但它超越了。 bool("") 将是 False,而任何其他非空字符串将是 True。空列表、dicts、元组是False,但只要不为空就转向True。这由__bool__ 类方法确定,该方法规定每当在对象上调用bool() 时应评估什么。

对于re.match 函数的输出,如果它没有找到模式(计算结果为False),它将返回None,或者返回re.Match 对象(计算结果为True)。

这就是为什么在您的情况下,由于已成功找到该模式,因此 if 子句的条件评估为 True。

【讨论】:

    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多