顯示具有 研讀筆記 標籤的文章。 顯示所有文章
顯示具有 研讀筆記 標籤的文章。 顯示所有文章

2018年10月10日 星期三

Ch11-Regular Expression


今天在這邊卡了很久

可能是因為講師的說明有點讓人誤會

論壇也超多人問,但是好像Quiz有這題的樣子

助教回答也是很模糊,避免把答案講出來了

筆記一下
  
    x = 'From steph@uct.ac.ze Sat Jan'
  

假設上面這個string

\S 表示 非空白字元

+   表示出現1~∞次


?   表示換成non-greedy模式

[Q]
我用 \S+?@\S+?   去比對
為何是得到
['steph@']  而不是 ['h@u'] ?

[解答]
預設若用\S+@\S+  會是 greedy模式尋找
比對出['steph@uct.ac.ze']
greedy就是當比對出好幾個結果時,會選擇範圍最大的
所以符合的結果有
steph@u
steph@uc
steph@uct
一直到
steph@uct.ac.ze

改成\S+?@\S+?
我把regex引擎比對步驟描述如下:

一開始先找非空白字元
所以從開頭F開始比對 F 非空白 所以成功
接著Fr  比對 F@失敗 
=> 引擎會expand 成 Fr@去比對,還是失敗
繼續expand 直到From後面有空白 所以從頭來過
從空白右邊的s開始比對s成功,
s@失敗
st@失敗
直到
steph@成功!!
再接著比對steph@u 也成功!
再比對steph@uc  也成功!  
但因為non-greedy 所以取最小的範圍

所以得到steph@u

[補充]
"\S+?@\S+?" 和 "\S+@\S+?"
比對stephen@marquard@uct.ac.za
會有不同的結果


可以去測試regex網站玩玩看

https://regex101.com/


參考資源

https://www.regular-expressions.info/repeat.html