1. 程式人生 > >re 模塊, 正則表達式 w+d+ 的重復問題引發的題目解析

re 模塊, 正則表達式 w+d+ 的重復問題引發的題目解析

匹配 pan 一位 應該 div 9.png sdf com 必須

題目

計算以下代碼的結果

s = "?!.18)dajslj$12.15613sdadw.123sdasda35615.168sndsda$15.6sdasd.sdfsdgw123.156s"

p1 = re.compile("\w+\.\w+\d+\.+\d+")
print(p1.findall(s)) 

p1 = re.compile("(\w+)\.(\w+)((\d+)\.+\d+)")
print(p1.findall(s))  

答案

# [‘3265sdadw.sdasda35615.168‘, ‘6sdasd.sdfsdgw123.156‘]
# [(‘3265sdadw‘, ‘sdasda3561‘, ‘5.168‘, ‘5‘), (‘6sdasd‘, ‘sdfsdgw12‘, ‘3.156‘, ‘3‘)]

解析

本題考查 正則分組優先原則以及輸出格式

附帶考查 \w+ \d+ 重復匹配問題

思考

第一個 \d+ 為什麽匹配到的是 5? 不應該是 35615嗎?

如果是認為是 35615 應該是產業以下兩種分析方式

方式一

技術分享圖片

很明顯 \w+ 可以匹配數字字母下劃線所以 後面的 35615 都是屬於 \w+ de 匹配範圍,所以這個分析方式絕對是錯的

方式二

技術分享圖片

這個分析方式已經基本上都對了, 但是在 \w+\d+ 一起對數字的處理的時候, 是使用的最小回退, 即值給一位給 \d+ 所以不會全部把35615給他

正確方式

技術分享圖片

最開始的"12" 為什麽不會被 \w+ 匹配成功?

技術分享圖片

看起來這樣子匹配是可以的,貌似。

但是 第二個 \w+\d+ 是鏈接在一起的, 即是要求必須\w+後面有數字,因此 \w+\d+、 就只能匹配到 15313, 然後就沒小數點就沒辦法匹配下去了。

所以是匹配不成功的。

re 模塊, 正則表達式 \w+\d+ 的重復問題引發的題目解析