2 回答
TA贡献1829条经验 获得超13个赞
你可以这样做:
import re
a = ['v-01-001', 'v-01-002', 'v-02-001', 'v-02-002', 'v-02-003', 'v-03-001']
pattern = re.compile('v-02-(\d{3})$')
print([m.group(1) for m in map(pattern.match, a) if m])
输出
['001', '002', '003']
你也可以使用finditer:
print([m.group(1) for ms in map(pattern.finditer, a) for m in ms])
输出
['001', '002', '003']
TA贡献1815条经验 获得超13个赞
四种方法可以做到这一点。
第一个只是一个常规的 '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']
或者,使用\nand re.Mvs two \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 年 12 月,会有更优雅的选择。根据PEP 572 中的定义,您将能够使用赋值语句,以便您可以在一个步骤中分配匹配项并测试匹配项:
[m.group(1) for s in a if (m:=re.search(r'v-02-(\d\d\d)', s))]
添加回答
举报