Skip to content

建立 2026-09-15 更新 2026-09-15

findall 與 finditer

search 只給第一處。要掃完整份文字,用 findallfinditer

findall:只要字串清單

import re

text = "錯誤 404、錯誤 500、警告 200"
print(re.findall(r"\d{3}", text))
# ['404', '500', '200']

有捕獲群組時,回傳的是群組,不是整段匹配。 這是最常踩的坑:

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 與重疊

引擎找到一處後,從匹配結束的下一個位置繼續。一般不會回傳重疊結果:

import re

print(re.findall(r"aa", "aaaa"))  # ['aa', 'aa']  不是三個重疊的 aa

若真的需要重疊,用先行斷言包住捕獲:r"(?=(aa))",再想清楚要不要這麼做。多數情況不需要。

相關資料