我正在为类分配,我正在使用正则表达式返回指定字符串中所有模式匹配的位置。如果有匹配,我将返回索引,如果没有找到匹配,我需要返回None。我已成功完成此操作但想将整个表达式放在一行中,正如我在注释的return语句中尝试的那样。
def searchMotif(sequence, motif):
if not type(motif) is str:
raise Exception("Invalid Motif")
#matches = re.finditer(motif, sequence)
#indices = [(match.start(), match.end()) for match in matches]
indices = [(match.start(), match.end()) for match in re.finditer(motif, sequence)]
if indices:
return indices
else:
return None
#return [(match.start(), match.end()) for match in matches]
#return [(match.start(), match.end()) for match in re.finditer(motif, sequence)]
理想情况下,我希望有一个类似的声明
return [(match.start(), match.end() for match in re.finditer(motif, sequence)] else None
。我知道这种语法不正确,但我希望它能够实现我想要实现的目标。我是正则表达式和列表理解的新手,所以我不确定你是否可以在我的列表理解中使用if语句。
是否可以通过Regex迭代器填充列表并在return语句中检查它是否为空?
答案 0 :(得分:2)
使用:
def test():
return [] or None
print(test())
输出:
None
原因是,任何空的可迭代(set,dict,list,string,...)都被视为False
代码为:
return indices or None # no if indices: needed
在此处阅读:https://docs.python.org/3/library/stdtypes.html#truth-value-testing
[...]大多数内置对象被认为是错误的:
- 常量定义为false:None和False。
- 任何数字类型的零:0,0.0,0j,十进制(0),分数(0,1)
- 空序列和集合:'',(),[],{},set(),range(0)
[...]