首页 > 解决方案 > 尝试优雅地使用“或”运算符

问题描述

我有一点正则表达式,用于生成新字符串:

someinput = "some/very/long/string"

changedinput = re.match("(.*\/)", str(thisDir)).group(1)[:-1]

.group(1)[:-1]用来获取实际的字符串,这段代码需要适用于各种字符串。

如果此处的输入字符串为"blbalba",则不匹配,正则表达式将返回 Nonetype,因此,在进行 grou() 调用时会出现此错误:

'NoneType' object has no attribute 'group'

我可以用这样的结构来解决:

someinput = "some/very/long/string"
tmp = re.match("(.*\/)", str(bla))# .group(1)[:-1]
if (tmp):
    changedinput = tmp.group(1)[:-1]
else:
    changedinput = ""    

虽然我需要行代码来实现这个非常简单的结构,但这确实让我很恼火。所以我开始在 python 中搜索类似 elvis 构造函数的东西,并找到了“或”运算符。然后我想我可以做这样的事情:

someinput = "some/very/long/string"
changedinput = re.match("(.*\/)", str(someinput)).group(1)[:-1] or ""

这里的原因是,如果不匹配,那么 group() 调用将再次抛出相同的错误。

有没有什么办法可以用很少的代码行,以一种很好的 Python 方式来做到这一点?

标签: pythonregex

解决方案


您可以使用赋值表达式:

changedinput = (tmp.group(1)[:-1] 
                if (tmp := re.match("(.*\/)", str(someinput))
                else "")

re.matchtmp被调用并在布尔上下文中对其进行评估之前分配其返回值。如果为真,tmp则用于调用group而不是re.match第二次调用的值。


推荐阅读