首頁 > 後端開發 > Python教學 > 為什麼當 `re.search()` 找到符合項目時 `re.findall()` 傳回空列表?

為什麼當 `re.search()` 找到符合項目時 `re.findall()` 傳回空列表?

Linda Hamilton
發布: 2024-12-19 09:23:09
原創
148 人瀏覽過

Why Does `re.findall()` Return an Empty List When `re.search()` Finds a Match?

re.findall 行為

如果re.findall() 函數在下列情況下未傳回預期結果,則可能會造成混亂:匹配一個字串。讓我們探討一下其在特定情況下行為背後的原因。

問題陳述

考慮以下來源字串:

s = r'abc123d, hello 3.1415926, this is my book'
登入後複製

且以下模式:

pattern = r'-?[0-9]+(\.[0-9]*)?|-?\.[0-9]+'
登入後複製

透過re.search,我們得到了正確的結果結果:

m = re.search(pattern, s)
print(m)  # <_sre.SRE_Match object; span=(3, 6), match='123'>
登入後複製

但是,re.findall回傳一個空白清單:

L = re.findall(pattern, s)
print(L)  # []
登入後複製

理解問題

有兩個的關鍵面向考量:

  1. 空匹配捕獲組: re.findall 從匹配對象返回捕獲的文本,但在此模式中,沒有捕獲組。結果,它會傳回空字串。
  2. 字元轉義: \.模式中符合兩個字元:以及換行符之外的任何字元。這不適用於匹配數值。

要正確符合數值,請改用以下模式:

pattern = r'-?\d*\.?\d+'
登入後複製

此模式比對:

  • -? - 可選減號
  • d* -可選數字
  • 。 ? - 可選的小數分隔符號
  • d - 一個或多個數字

使用此修正後的模式,re.findall 將傳回預期清單:

['123', '3.1415926']
登入後複製

以上是為什麼當 `re.search()` 找到符合項目時 `re.findall()` 傳回空列表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板