findall 與 finditer
search 只給第一處。要掃完整份文字,用 findall 或 finditer。
findall:只要字串清單
有捕獲群組時,回傳的是群組,不是整段匹配。 這是最常踩的坑:
import re
text = "2026-09-15 與 2025-01-02"
print(re.findall(r"\d{4}-\d{2}-\d{2}", text))
# ['2026-09-15', '2025-01-02']
print(re.findall(r"(\d{4})-(\d{2})-(\d{2})", text))
# [('2026', '09', '15'), ('2025', '01', '02')]
print(re.findall(r"(\d{4})-\d{2}-\d{2}", text))
# ['2026', '2025'] 只剩第一組
只要整段、不要分欄,就把括號改成 (?:...),或改用 finditer 再呼叫 group(0)。
finditer:每次一個 Match
需要位置、具名群組、或同時要整段與欄位時用這個:
import re
text = "alice@vcdemy.com 與 bob@example.org"
pattern = re.compile(
r"(?P<user>[\w.]+)@(?P<host>[\w.]+)"
)
for m in pattern.finditer(text):
print(m.group(0), "→", m.group("user"), m.group("host"), "@", m.start())
finditer 回傳迭代器,大檔案不會一次生出所有字串清單。
findall 與重疊
引擎找到一處後,從匹配結束的下一個位置繼續。一般不會回傳重疊結果:
若真的需要重疊,用先行斷言包住捕獲:r"(?=(aa))",再想清楚要不要這麼做。多數情況不需要。
相關資料
- 上一頁:search / match
- 下一頁:sub 與 split
- 實作:擷取欄位