看板 Python 關於我們 聯絡資訊
※ 引述《play9091 (長工)》之銘言: 恕刪
play9091:代碼如網址:http://dpaste.com/hold/1351377/ 08/21 14:51
play9091:在上面的代碼中,它可以實現,單筆置換。但全文失敗。 08/21 14:52
play9091:我做了一些改動,但是最後一行還是錯了! 08/21 16:02
play9091:http://dpaste.com/hold/1351463/ 08/21 16:02
play9091:最後我把它做成下面這樣子,不知道會不會有什麼隱憂 08/21 16:59
play9091:http://dpaste.com/1351527/ 08/21 16:59
鑒於不能讓新人一知半解的精神,只好來解釋三個連結的pattern有什麼差別。 雖然我這篇文講的東西在官方文件都有= = 首先,*跟+的行為都是 greedy 的, 這就是為何第一個連結會把 lset 也納入第三 group 裡, 因為 [^ ]* 包括換行,它只有遇到空白才會停下來,於是順便吃掉 lset。 若檢查一下檔案,僅加入會遇到的字元如 [\w,=$], 或是讓它不要 greedy ,就不會有看起來很奇怪的結果。 第二個連結最後一行也是一樣的道理,pattern 只有擋掉遇到空白後沒有換行的情形, 沒有擋掉沒遇到空白就直接結束的情形。 最後 (.*) 可以用的原因很簡單,就是.不包含換行。 這種做法當然會有隱憂,若檔案裡只有 lset 資料跟空白就爆炸了, 但解法也很容易,一樣不要 greedy 就 ok 了。 若檔案每行都只包含一組lset, 那原po需要的 pattern 只是 r'lset\s+(.*?)\s+(.*?)\s+(.*?)' 繞了一大圈,仔細想想還滿空虛的,都怪被 aaa bbb 誤導,以為只有word。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.194.13.159
play9091:其實,您最後面說到的方法,我一開始就試了。結果是不行 08/21 18:44
play9091:測試如下:http://dpaste.com/1351640/ 08/21 18:46
啊忘記\s包括換行,我改成非greedy了。 ※ 編輯: ck574b027 來自: 123.194.13.159 (08/21 20:31)
play9091:加上問號後,的確可以了,但是最後一個匹配不用問號! 08/21 21:39
play9091:測試如下:http://dpaste.com/1351824/ 08/21 21:39
play9091:一直沒懂'問號'是怎麼用的?煩請指教…… 08/21 21:45
ck574b027:?就是叫*或+配越少字越好,不要greedy的意思。 08/21 22:40