re 模塊, 正則表達式 w+d+ 的重復問題引發的題目解析
阿新 • • 發佈:2019-05-01
匹配 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+ 的重復問題引發的題目解析