Re: [問題] 正規表示法"*?"

看板Python作者 (Mr. Pan)時間9年前發表 (2016/05/28 14:01), 9年前編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/5 (看更多)
※ 引述《cryinrain (啞貓)》之銘言: : 各位高手好,最近小弟在自學Python : 在精通Python這本書裡面,在正規表示法這段有講到一個指定符"prev *?" : 解釋是"零個或多個prev,愈少愈好" : 自己練習測試了半天,卻無法理解這個指定符是什麼意思 : 懇請各位高手指導有沒有比較容易理解的方式 這邊先不討論 Python , 以 Regexp 來說,用於數量的修飾應 該只針對前面跟隨的字元或集合(或群組) 我自己對 Python 的正規表示法沒有很熟悉,不知道有沒有特殊用法, 但理論上這些應該都是一樣的 以這個為例子不是很好,我稍微修改一下成: prev* , 先不考慮那個 ? 以這個例子來說的話, * 代表 "零個以上" 修飾的是 v 因此底下這些都符合這個敘述: pre prev prevv prevvvvvvvvvvvvvvvvvvvvvvvvv 這樣寫: (prev)* 的話,那麼底下這些都符合: <=== 什麼都沒有的空字串 prev prevprev prevprevprev 回頭看這個 ? , 這是當 ? 跟在數量修飾的 + 和 * ...等後面時,是越少越好 這邊舉的這個例子也很不好,稍微修改一下: pre.*x 先看沒有加上 ? 的 首先要先知道 * 修飾的是前面的 . 而我們知道 . 代表任意字元 所以簡單來說這個正規表示法就是在描述一個字串是 pre[任意字元任意數量]x OK ,那麼底下這幾個字串,到底哪邊屬於 .* 的範圍呢? prevx => prevx prev1234x => prev1234x prevx1234x => prevx1234x 第三個是不是出乎意料外呢? 這是初學正規表示法很容易遇到的問題,在 regepx 中, * 是 greedy:貪婪模式,盡可能的取,但還是要盡量能符合這個表示法 因此在第三個字串中,雖然遇到了 prevx1234x 這個 x 但是他發現,後面還有一個 x 還可以讓我符合這個表示法 所以他會很貪心的把第一個 x 和後面的 1234 一併吃掉 所以第三個字串的 .* 會把 prevx1234x 黃色部分都吃掉 如果現在加上了 ? ,也就是: pre.*?x 那麼這樣就不是貪婪模式了,而是 Reluctant ,盡量少取 前量個範例得到的結果都相同,而第三個的 .*? 就只會把 prevx1234x 這個 v 給吃掉,這就是所謂的取越少越好。 當然這邊還關係到你是要 match 還是只是 search , 會有所不同。 但他的概念就是這樣。 參考用 js 實作的部分: https://jsfiddle.net/tz9kpcrb/2/ 或者執行這個 code 試試看: import re ptr1='pre(.*)x' ptr2='pre(.*?)x' print(re.findall(ptr1,'prevx1234x')) print(re.findall(ptr2,'prevx1234x')) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.139.154.78 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1464444106.A.7C3.html ※ 編輯: darkk6 (223.139.154.78), 05/28/2016 22:24:20

06/07 09:42, , 1F
用心。清楚的好文
06/07 09:42, 1F
文章代碼(AID): #1NIQJAV3 (Python)
討論串 (同標題文章)
文章代碼(AID): #1NIQJAV3 (Python)