[NLP] 正規表達式介紹

正規表達式

正規表達式有些會翻譯為正則表達式(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/

讓我知道你在想什麼!

Picture of ALEX

ALEX

藍白拖愛好者,一事無成話偏多

Recent Posts

C++

NLP