正規表達式
正規表達式有些會翻譯為正則表達式(Regular Expression),一般也會用 regex 代表,
有一個很重要的觀念是,當我們在處理機器學習或是深度學習相關的案子時,其實花非常多時間在前置處理上,像是收集資料、資料正規化等等。自然語言處理身為人工智慧的分支自然也不例外,我們需要以一個電腦懂的方式去處理語言資料。除了文本處理外,正規表達式也常用在模式比對和解析資料,以一個電腦懂的方式去拼湊出要配對的模式。
基本字母配對
最基本配對就是直接根據輸入的文字來和對是否完全相符。
正則表達式:A
測試字串:Hi, I am Alex.
大小寫有差別,因此只會比對到 Alex 的 A 有相符。
配對集合
不只字母一個一個比對,有時候會有長很像的詞配對,例如英文常見的和過去式只差一個字的型態,拿 draw、drew 為例子:
正則表達式:dr[ae]w
測試字串:Tom is about to draw the picture which I drew yesterday.
如果是要配對某一段連續的英文字母呢?例如想配對是否有 s*ng 的詞,星號可以是 a 到 z 的任一字母:
正則表達式:s[a-z]ng
測試字串:I like to sing the song which Zoe sang before.
另外數字當然也可以這麼寫,例如希望英文小寫和數字全符合:
正則表達式:[a-z0-9]
測試字串:I like to sing the song which Zoe sang on December 12th.
如果是要排除某集合以外,和上述方式類似,並加上 ^
符號。以下就是配對 s*ng 但排除星號是 g – p 之間(包含 g、p)的任一字母的字。
正則表達式:s[^g-p]ng
測試字串:I like to sing the song which Zoe sang before.
Or
一般程式語言有 or 的邏輯符號,正規表達式也會有,且符號也是 |
。表示前面的詞和後面的詞都 ok。以處理順序上來說會先比對前面的詞,再配對後面的詞。
正則表達式:dog|cat
測試字串:I prefer dogs than cats.
除了上述比較直觀的寫法外,正規表達式有相當多特殊符號表達其他配對。通常會用 \
在前面表示接下來是特殊字元。
邊界
\b
符合邊界。例如 \b***
表示詞的左邊界符合***;而 ***\b
是右邊界配對***。
正則表達式:\bre
測試字串:I’m not sure that if her comments about the bread are off the record.
正則表達式:re\b
測試字串:I’m not sure that if his comments about the bread are off the record.
\B
符合非邊界。例如 \B***
表示有 *** 的字,但不是在左邊界;或是 ***\B
表示有 *** 的字,但不是出現在右邊界。
正則表達式:\Bre
測試字串:I’m not sure that if his comments about the bread are off the record.
正則表達式:re\B
測試字串:I’m not sure that if his comments about the bread are off the record.
數字
\d
符合數字。這個超級常用的喔!也和上面曾出現過的 [0-9] 意思一樣。
正則表達式:\d
測試字串:There is 2 dogs and 3 cats.
\D
符合非數字。任何非數字都符合,包含標點符號和空白等等。
正則表達式:\D
測試字串:There is 2 dogs and 3 cats.
單詞
\w
符合包含底線的任何單詞字元。也等於 [A-Za-z0-9_]
。
正則表達式:\w
測試字串:There is 2 dogs, 6 rabbits, and 3 cats.
\W
符合任何非單詞字元。等於 [^A-Za-z0-9_]
。
正則表達式:\W
測試字串:There is 2 dogs, 6 rabbits, and 3 cats.
空白
\s
符合任何空白字元。
正則表達式:\s
測試字串:Hey ha ha.
\S
符合任何非空白字元。
正則表達式:\S
測試字串:Hey ha ha.
配對的次數
有時候我們設定好一種配對,需要重複比對,例如想配對三位數,可以寫為 \d\d\d,但寫下來很容易太冗長,這時候可以依靠一些符號輔助我們精簡一點語法。
配對 0 次或 1 次以上:利用 *
。
正則表達式:\w*-*\d
測試字串:egg-100 yee hot dog-20 yeee
可有可無,出現 0 次或是 1 次:利用 ?
。
正則表達式:colou?r
測試字串:color colour,表示 u 可以不用,或是出現一次。
配對 1 次或是 1 次以上:利用 +
。
正則表達式:go+d
測試字串:god good gd
指定出現次數:利用 {次數}
。
正則表達式:go{3}d
測試字串:gd god good goood gooood
指定一個範圍內的次數:利用 {最小次數, 最大次數}
。
正則表達式:go{1,3}d
測試字串:gd god good goood gooood
開頭、結尾
符合字串開頭用 ^
。這裡要注意開頭不是單詞開頭,而是以一行為單位的開頭(這樣講好怪,我們還是直接看例子好了)。
正則表達式:^ry
測試字串:
merry marry
rythm Harry rythm
符合字串結尾用 $
。這裡也和上面一樣,不是單詞結尾,而是以一行為單位的結尾。
正則表達式:ry$
測試字串:
merry marry
rythm Harry rythm
好,就先這樣,還有太多太多了,可以直接參考維基百科正規表示式。在測試正則表達的時候,可以用這個網站先試試看:https://regex101.com/