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

作者: darkk6 (Mr. Pan)   2016-05-28 22:01:44
※ 引述《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'))
作者: wadd (醜男轉世-低調)   2016-06-07 09:42:00
用心。清楚的好文

Links booklink

Contact Us: admin [ a t ] ucptt.com