为了账号安全,请及时绑定邮箱和手机立即绑定

安全解包空元组数组

安全解包空元组数组

有只小跳蛙 2021-10-26 15:44:32
行import re; print(re.findall("(.*) (.*)", "john smith"))输出[("john", "smith")],可以像[(first_name, last_name)] = re.findall(...). 但是,在不匹配(findall返回[])的情况下,此解包会引发ValueError: not enough values to unpack (expected 1, got 0).安全解包这个元组数组的正确方法是什么,它可以在匹配 ( [("john", "smith")]) 和非匹配 ( []) 场景中工作?
查看完整描述

3 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

一般的答案是在跳之前先看看:


if result:

    [(first_name, last_name)] = result

或请求原谅:


try:

    [(first_name, last_name)] = result

except ValueError:

    pass

但是您实际上通过使用re.findall()来查找单个结果使事情变得过于复杂。使用re.seach()并提取您的匹配组:


match = re.search("(.*) (.*)", value)

if match:

    firstname, lastname = match.groups()

或者


try:

    firstname, lastname = re.search("(.*) (.*)", value).groups()

except AttributeError:

    # An attribute error is raised when `re.search()` returned None

    pass


查看完整回答
反对 回复 2021-10-26
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

一般的答案是在跳之前先看看:


if result:

    [(first_name, last_name)] = result

或请求原谅:


try:

    [(first_name, last_name)] = result

except ValueError:

    pass

但是您实际上通过使用re.findall()来查找单个结果使事情变得过于复杂。使用re.seach()并提取您的匹配组:


match = re.search("(.*) (.*)", value)

if match:

    firstname, lastname = match.groups()

或者


try:

    firstname, lastname = re.search("(.*) (.*)", value).groups()

except AttributeError:

    # An attribute error is raised when `re.search()` returned None

    pass


查看完整回答
反对 回复 2021-10-26
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

由于re.findall回报不匹配的情况下,空列表,你可以使用or运营商默认值分配给first_namelast_name替代:

[(first_name, last_name)] = re.findall("(.*) (.*)", "johnsmith") or [(None, None)]


查看完整回答
反对 回复 2021-10-26
  • 3 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信