Cómo usar re coincidir objetos en una lista de comprensión

Tengo una función para seleccionar bultos de una lista de cadenas y devolverlos como otra lista:

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

¿Hay una manera de reformular esto como una lista de comprensión? Obviamente es bastante claro como es; Sólo curioso.


Gracias a quienes contribuyeron, mención especial para @Alex. Aquí hay una versión condensada de lo que terminé con; el método de coincidencia de expresiones regulares se pasa a filterPick como un parámetro “pre-izado”:

 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] 

El “truco” es la parte for m in [regex.search(l)] , así es como “asigna” un valor que necesita usar más de una vez, dentro de una lista de comprensión, agregue una cláusula de este tipo, donde el objeto “itera” sobre una lista de un solo elemento que contiene el único valor que desea “asignarle”. Algunos lo consideran estilísticamente dudoso, pero a veces me parece práctico.

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

Se podría acortar un poco.

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

Podría ponerlo todo en una línea, pero eso significaría que tendría que hacer coincidir cada línea dos veces, lo que sería un poco menos eficiente.

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

Eso también funciona con una consulta de búsqueda que estás buscando en una lista.

`P = ‘a’, ‘b’, ‘c’

‘b’ en P ‘devuelve verdadero