亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從字符串列表中獲取子字符串列表,其中子字符串與某個正則表達式匹配

從字符串列表中獲取子字符串列表,其中子字符串與某個正則表達式匹配

肥皂起泡泡 2021-07-07 18:39:35
這個問題是針對 Python 3.6+ 的(但也可以為其他讀者回答較低的 Python)。我想從匹配正則表達式的每個字符串中提取一個子字符串。說我有以下幾點:a = ['v-01-001', 'v-01-002', 'v-02-001', 'v-02-002', 'v-02-003', 'v-03-001']我想要所有匹配的字符串的最后 3 位數字v-02-\d\d\d,即:['001', '002', '003']我天真的嘗試:[x[1] for x in list(map(lambda i: re.search(r'v-02-(\d\d\d)', i), a)) if x]你能想出更優雅的東西嗎?
查看完整描述

2 回答

?
烙印99

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']


查看完整回答
反對 回復 2021-07-13
?
蕭十郎

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))]


查看完整回答
反對 回復 2021-07-13
  • 2 回答
  • 0 關注
  • 246 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號