Python正则表达式:检查匹配和捕获组。

3

我希望使用if语句确保字符串与正则表达式匹配,并同时存储捕获组。我认为以下代码展示了我想要的内容,但它在语法上是无效的。有没有一种优雅的方式来实现以下内容?

yyyyq_format = "19984"

if regex_match = re.search("^(\d{4})(\d)$", yyyyq_format):
    found_q = regex_match[2]
else:
    raise ValueError("Format \"yyyyq\" is not followed.")

我知道以下方法可行(这是我唯一的选择吗?):

yyyyq_format = "19984"
regex_match = re.search("^(\d{4})(\d)$", yyyyq_format)

if regex_match:
    found_q = regex_match[2]
else:
    raise ValueError("Format \"yyyyq\" is not followed.")
2个回答

5
PEP-572(赋值表达式)实现了所谓的“海象运算符”,您可以使用它来一次性评估表达式并将返回赋给一个名称,例如:

PEP-572 (assignment expressions) 实现了被称为海象运算符的东西,您可以使用它来一次性评估表达式并将返回值分配给一个名称,例如:

if regex_match := re.search("^(\d{4})(\d)$", yyyyq_format):
    found_q = regex_match[2]
else:
    raise ValueError("Format \"yyyyq\" is not followed.")

请注意在=之前的冒号:
这将在Python 3.8中(将要)提供。
在那之前,我认为你的第二个选项是唯一的方法。

2

在Python 3.8中,海象运算符:=是一种选择,或者您可以使用for else语句(请注意re.finditer):

最初的回答:

import re

yyyyq_format = "19984"

for g in re.finditer("^(\d{4})(\d)$", yyyyq_format):
    found_q = g[2]
    break
else:
    raise ValueError("Format \"yyyyq\" is not followed.")

print(found_q)

输出:

4

这样只为了检查匹配就太昂贵了。 - heemayl
@heemayl 为什么这么贵?OP想要将第二组分配给found_q或引发异常。 - Andrej Kesely
首先,当你可以通过match(2)轻松获取所需的匹配项,并且只需检查是否存在匹配项即可获得结果时,使用for循环有什么意义呢?这是微不足道的,也是Pythonic的。 - heemayl
@heemayl 的意思是 OP 不想在外部创建临时变量(regex_match)。 - Andrej Kesely
1
我可能错了,但我认为这并不昂贵,而且正好符合我的要求。保证最多只有1次迭代,下限为0次。 - Hurricane Development

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接