2018年10月24日 星期三

Regular expressions速查速記

Python Regular Expression Quick Guide

^        比對一列的開頭

$        比對一列的結尾

.        比對任何字元

\s       比對空白(whitespace)

\S       比對任何非空白字元(non-whitespace character)

*        使單一字元出現多次 (可能0次-沒出現)

*?       使單一字元出現多次(非greedy)


+        使單一字元出現多次 (至少1次)

+?       一個字元出現1次以上(非greedy)


[aeiou]  比對有出現在集合內的單一字元

[^XYZ]   比對有沒出現在集合內的單一字元


[a-z0-9] 字元集合可包含範圍

(        要取出字串的起點

)        要取出字串的終點





[速記法]



\s       小寫space  =>空白字元

\S      大寫space =>非空白字元


^        符號在上標  =>表示開頭

$        stop   => 表示結尾


*     長的像0  => 出現多次(可能0次)

+      長的像1  => 出現多次(至少1次)


.     任何影像都是從點開始  =>單一任何字元


[練習]
請解釋意思
^X.*:

^X-\S+:

[0-9]+








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








2018年10月9日 星期二

研讀中

等我拿到PY4E certificate後
就來翻譯跟筆記這些資源吧

2018/10/9