2011-12-28 2 views
0

У меня есть список регулярных выражений, которые я хочу выполнить над одной строкой. Мне все равно, какие выражения совпадают, мне просто нужны их результаты (объекты re.Match).Можно ли преобразовать этот код карты/фильтра в список?

Конечно, это легко с циклом for, но я хотел чего-то более питонического. Это то, что я получил в настоящее время:

all_matches = map(lambda x: x.match(domain), 
        (first_re, second_re, third_re)) 
matches = [m for m in all_matches if m] 

Я чувствую под моей кожей, однако, что это должно быть выполнимо в качестве единого понимания. Как это должно выглядеть, если это вообще возможно?

Кроме того, в более общем смысле, являются ли перечисления, эквивалентные карте/фильтру, или они просто имеют подмножество возможностей m/f?

+1

карта/фильтр может сделать часть того, что могут сделать списки. –

ответ

3

Это можно сделать простым пониманием списка. Однако r.match(domain) должны быть оценены дважды:

matches = [r.match(domain) for r in (first_re, second_re, third_re) if r.match(domain)] 

Или вам придется написать двойной список понимание:

matches = [a for a in (r.match(domain) for r in (first_re, second_re, third_re)) if a] 
+0

Двойное понимание списка - почему я не подумал об этом :) Спасибо! – GDR

1

В общем, фильтр/карта может быть записана в виде списка понимания (см. documentation). В этом случае вы можете написать matches = [x.match(domain) for x in (first_re, second_re, third_re) if x.match(domain)].

Смежные вопросы