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))]
添加回答
舉報