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() 调用将再次抛出相同的错误。
有没有什么办法可以用很少的代码行,以一种很好的 Python 方式来做到这一点?
解决方案
您可以使用赋值表达式:
changedinput = (tmp.group(1)[:-1]
if (tmp := re.match("(.*\/)", str(someinput))
else "")
re.match
tmp
被调用并在布尔上下文中对其进行评估之前分配其返回值。如果为真,tmp
则用于调用group
而不是re.match
第二次调用的值。
推荐阅读
- docker - 我的容器化 tomcat Web 应用程序看不到配置的 log4j2.xml
- python - Python keras:to_categorical indexerror
- javascript - 是否可以覆盖时钟功能,以便我可以更改它的时间?
- c# - 限制对 Logs 文件夹的访问
- vue.js - 切换到移动视图后VueJs滚动条消失
- apache-nifi - Set Content-type Apache NiFi dynamically
- c++ - 使用 2 个线程搜索
- node.js - Why does Firebase Cloud-Function send back an error object instead of the actual data
- javascript - Reverse radialGradient SVG animation on mouseout on hovered element
- python - django.db.utils.InterfaceError: (0, '') 使用 django 模型时