如何在列表理解中使用重新匹配对象

我有一个函数来从string列表中选出一个块,并将它们作为另一个列表返回:

def filterPick(lines,regex): result = [] for l in lines: match = re.search(regex,l) if match: result += [match.group(1)] return result 

有没有办法将这个重新expression为一个列表理解? 显然这是相当清楚的。 只是好奇。


感谢那些贡献者,特别提到@Alex。 这里是我最终的结果。 正则expression式匹配方法作为“预悬挂”parameter passing给filterPick:

 import re def filterPick(list,filter): return [ ( l, m.group(1) ) for l in list for m in (filter(l),) if m] theList = ["foo", "bar", "baz", "qurx", "bother"] searchRegex = re.compile('(a|r$)').search x = filterPick(theList,searchRegex) >> [('bar', 'a'), ('baz', 'a'), ('bother', 'r')] 
 [m.group(1) for l in lines for m in [regex.search(l)] if m] 

“诀窍”是for m in [regex.search(l)]部分中的for m in [regex.search(l)] – 这就是你如何“分配”一个你需要在列表理解中多次使用的值 – 在这里添加一个这样的子句,其中该对象“遍历”一个包含要“分配”给它的值的单个项目列表。 有些人认为这在风格上可疑,但我觉得有时候是实用的。

 return [m.group(1) for m in (re.search(regex, l) for l in lines) if m] 

它可以缩短一点

 def filterPick(lines, regex): matches = map(re.compile(regex).match, lines) return [m.group(1) for m in matches if m] 

你可以把它全部放在一行,但这意味着你必须匹配每一行两次,效率会有所下降。

 >>> "a" in "a visit to the dentist" True >>> "a" not in "a visit to the dentist" False 

这也适用于您在列表中search的search查询

`P ='a','b','c'

P中的'b'返回true