Четыре способа сделать это.
Первый - это просто обычный цикл ole:
li=[]
for s in a:
m = re.search(r'v-02-(\d\d\d)', s)
if m:
li.append(m.group(1))
# li=['001', '002', '003']
Второй в двух вызовах одного и того же регулярного выражения в понимании списка:
>>> [re.search(r'v-02-(\d\d\d)', s).group(1) for s in a if re.search(r'v-02-(\d\d\d)', s)]
['001', '002', '003']
Третье - использовать map
:
>>> [m.group(1) for m in map(lambda s: re.search(r'v-02-(\d\d\d)', s), a) if m]
['001', '002', '003']
Наконец, вы можете сгладить список с помощью .join
и затем использовать findall
:
>>> re.findall(r'\bv-02-(\d\d\d)\b', '\t'.join(a))
['001', '002', '003']
Или используйте \n
и re.M
против двух \b
:
>>> re.findall(r'^v-02-(\d\d\d)$', '\n'.join(a), flags=re.M)
['001', '002', '003']
Я бы написал это в том же порядке, если бы писал этот фрагмент кода.
То, что считается более изящным , в глазах смотрящего, я полагаю.Я бы посчитал, что последний будет более элегантным.
Вы также можете пропустить регулярное выражение и использовать строковые методы Python:
>>> prefix='v-02-'
>>> [e[len(prefix):] for e in filter(lambda s: s.startswith(prefix),a)]
['001', '002', '003']
Это, вероятно,будьте самыми быстрыми , если это имеет значение в этом случае.
В декабре 2019 года будет более элегантная альтернатива.Как определено в PEP 572 , вы сможете использовать оператор присваивания, чтобы вы могли назначить совпадение и проверить совпадение за один шаг:
[m.group(1) for s in a if (m:=re.search(r'v-02-(\d\d\d)', s))]