首頁 >後端開發 >Python教學 >為什麼 `re.findall()` 不傳回重疊的正規表示式匹配,如何修復它?

為什麼 `re.findall()` 不傳回重疊的正規表示式匹配,如何修復它?

Patricia Arquette
Patricia Arquette原創
2024-12-06 10:23:12408瀏覽

Why Doesn't `re.findall()` Return Overlapping Regex Matches, and How Can I Fix It?

深入挖掘重疊的正規表示式匹配

在正規表示式的世界中,理解為什麼可能找不到某些匹配可能會令人費解。考慮以下範例:

match = re.findall(r'\w\w', 'hello')
print(match)

如預期的那樣,此程式碼片段會傳回一個包含「he」和「ll」的列表,它們與兩個字母序列的模式相符。然而,人們可能想知道為什麼結果中不包含似乎也符合該模式的“el”和“lo”。

此行為源自於 re.findall 函數的預設行為,而該行為不會產生重疊匹配。換句話說,它沿著字串移動,只查找給定模式的第一個匹配項,而不考慮任何潛在的重疊。

為了解決這個問題,有一個涉及先行斷言的巧妙解決方法。前瞻性斷言 (?=...) 匹配模式而不實際消耗任何字串。這使我們能夠找到滿足給定模式的所有重疊匹配。

例如,要使用前瞻斷言來尋找字串「hello」中的所有兩個字母序列,可以使用以下表達式:

re.findall(r'(?=(\w\w))', 'hello')

此表達式將傳回一個包含[' he', 'el', 'll', 'lo']的列表,因為每個兩個字母的序列都成功匹配,無需

了解前瞻斷言及其實際應用可以大大增強正則表達式在複雜匹配場景中的有效性。

以上是為什麼 `re.findall()` 不傳回重疊的正規表示式匹配,如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn