【发布时间】:2021-05-13 18:29:52
【问题描述】:
我有一小部分正则表达式用于生成新字符串:
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 构造函数的东西,并找到了 "or" 运算符。 然后我想我可以做这样的事情:
someinput = "some/very/long/string"
changedinput = re.match("(.*\/)", str(someinput)).group(1)[:-1] or ""
这里的原因是,如果没有匹配,那么 group() 调用将再次抛出相同的错误。
我有什么方法可以做到这一点,只需几行代码,以一种不错的 Python 方式?
【问题讨论】:
-
最后四行可以替换为
changedinput = tmp.group(1)[:-1] if tmp else "" -
您也可以不使用正则表达式
(.*)\/捕获\/。这样,第 1 组就已经是正确的了 -
or顺便说一句,将无法在此上下文中处理所有测试用例。