尝试优雅地使用“或”运算符

2024-07-03 07:26:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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()调用将再次抛出相同的错误

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


Tags: 字符串代码restringmatch错误groupsome
2条回答

你可以这样做:

changedinput = tmp.group(1)[:-1] if tmp else ""

这也更“pythonic”,因为它的代码更少,但效率更低,因为您要调用re.match()两次:

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

可以使用赋值表达式:

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

调用re.match,并在布尔上下文中对其求值之前将其返回值赋值给tmp。如果为true,则使用tmp的值来调用group,而不是第二次调用re.match

相关问题 更多 >