正則表達式(Regular Expressions,簡稱 regex)是一種強大的文本處理工具,允許開發者以高度靈活和效率的方式搜索、替換、分析和操作文本數據。在資料科學領域,正則表達式提供了一種解析大規模數據集、清洗數據和提取有價值信息的有效方法。
正則表達式是用於描述字符串匹配模式的語言。它們主要用於字符串搜尋和替換操作,支持一些特定的語法規則,讓用戶能夠定義一個或多個匹配的規則。在資料科學中,正則表達式尤其重要,它們可以快速地從大量的文本數據中提取有用的信息,進而被廣泛地運用在許多程式語言中,並在不同的地方扮演著不同的角色,例如從日誌文件中提取日期和時間信息,或從社交媒體數據中識別和提取特定的話題標籤,甚至我們日常所使用的密碼設置時的大小寫識別等。若是沒有程式編譯環境,也可以透過regex101 這個網站來進行正則表達式的練習。
本篇文章會簡單說明關於正則表達式的語法及應用,並且再以 R 做簡單的程式上使用的舉例。
基本搜索 #
首先對於 R 的字串處理我們需要載入 stringr
這個 package,它是一個對於在 R 環境中進行文字探勘十分重要的套件。
install.packages("stringr")
library(stringr)
?
#
在這個符號前的字符代表可有可無的意思,以下面為例,若我們想在句子中抓取包含 use 的詞,我們可以透過在 d 後面加入 ?
來使 use 的變體 used。
sentence <- "use a used variable name is illegal."
str_extract_all(sentence, "used?")
# [[1]]
# [1] "use" "used"
*
#
若是我們在搜索條件中加入這個條件,則代表在搜尋字串時需同時滿足三個條件才會被匡列成搜索對象:
-
在搜索時除了不能出現其他字符外, * 前的字符只需「不需出現」、「出現一次」或「出現多次」其中之一即可。
-
滿足前後字符的條件。
以下面的例子來說,我們可以看到不論 b 出現多少次,都能正確的被正則表達式切割並抓取滿足條件之部分。但若是中間是 d,則因爲我們規定 a 和 c 中間只能出現零到多個 b,並不能出現其他字符,因此該字串不會被搜索。
sentence <- c("acd, abc, abbbbbcddddc, adc, addddddc")
str_extract_all(sentence, "ab*c")
# [[1]]
# [1] "ac" "abc" "abbbbbc"
+
#
與上面不同的是,若我們希望 * 前的字符最少需出現一次,則我們可以使用 + 來做搜尋。下面是一個簡單的例子,我們可以看到在下面相較於上面的搜尋結果而言,‘acd’ 因為中間沒有 b 而沒有被抓取出。
sentence <- c("acd, abc, abbbbbcddddc, adc, addddddc")
str_extract_all(sentence, "ab+c")
# [[1]]
# [1] "abc" "abbbbbc"
()
#
若是我們想在正則表達式中組合條件,我們可以使用 () 來達成需求,首先我們先來看到關於合併檢索的部分,下面是一個將 ab 組合後搜尋的例子,我們可以得到滿足大於等於出現一次 ab 條件的字符串。
sentence <- c("acd, ababc, abbbc, abababbbcddddc, adc, adadddddc")
str_extract_all(sentence, "(ab)+")
# [[1]]
# [1] "abab" "ab" "ababab"
接著我們也可以透過加入 | 來執行搜索中「或」的操作,例如當我們想要得到大於等於出現一次 ab 或 ad 條件的字符串時可以進行下面的操作。
sentence <- c("acd, ababc, abbbc, abababbbcddddc, adc, adadddddc")
str_extract_all(sentence, "(ab|ad)+")
# [[1]]
# [1] "abab" "ab" "ababab" "ad" "adad"
{}
#
在這裡若是我們想定義字符中出現的精確次數,我們可以透過加入 {} 及數字來做搜索。下面是一個簡單的範例。
sentence <- c("acd, abbc, abbbc, abbbbbcddddc, adc, addddddc")
str_extract_all(sentence, "ab{2}c")
# [[1]]
# [1] "abbc"
而若是我們希望有一個搜索的範圍,我們可以在 {} 中加入區間來做範圍搜索。若我們想從段落中擷取出現 0~3 次 b 的字串,則簡單的範例如下。
sentence <- c("acd, abbc, abbbc, abbbbbcddddc, adc, addddddc")
str_extract_all(sentence, "ab{0,3}c")
# [[1]]
# [1] "ac" "abbc" "abbbc"
同時我們希望指定一個搜索的方向,我們也可以在 {} 中只放入範圍的上界或下界來做搜索。若我們想從段落中擷取出現大於等於 3 次 b 的字串,我們可以進行如下的操作。
sentence <- c("acd, abbc, abbbc, abbbbbcddddc, adc, addddddc")
str_extract_all(sentence, "ab{3,}c")
# [[1]]
# [1] "abbbc" "abbbbbc"
[]
#
若是我們想要搜索滿足特定字符條件的字串,我們可以使用 [] 來篩選字符,其中 a-z
與 A-Z
分別為代表大小寫字母的字符串,而 0-9
是代表數字的字符串。下面是我們的範例演示。
sentence <- "abc, tiger, aabbcc, dog, 1234678, abc123456, ABCDEFG"
str_extract_all(sentence, "[a-z]+")
# [[1]]
# [1] "abc" "tiger" "aabbcc" "dog" "abc"
sentence <- "abc, tiger, aabbcc, dog, 1234678, abc123456, ABCDEFG"
str_extract_all(sentence, "[A-Z]+")
# [[1]]
# [1] "ABCDEFG"
sentence <- "abc, tiger, aabbcc, dog, 1234678, abc123456, ABCDEFG"
str_extract_all(sentence, "[0-9]+")
# [[1]]
# [1] "1234678" "123456"
同時若是要將條件混用只需將條件一同輸入即可。
sentence <- "abc, tiger, aabbcc, dog, 1234678, abc123456, ABCDEFG"
str_extract_all(sentence, "[A-Z0-9]+")
# [[1]]
# [1] "1234678" "123456" "ABCDEFG"
^
#
若我們要添加除外的搜索條件,只需在條件前加上 ^ 即可,下面是在句子中剔除包含數字逗號及空格的表示法。
sentence <- "abc, tiger, aabbcc, dog, 1234678, abc123456, ABCDEFG"
str_extract_all(sentence, "[^0-9^,^ ]+")
# [[1]]
# [1] "abc" "tiger" "aabbcc" "dog" "abc" "ABCDEFG"
元字符 #
在正則表達式中,我們一樣可以透過加入元字符來做條件的搜索,下面是一些常見的元字符及其定義,它們一樣可以透過加入上面的基本搜索來豐富我們的字串查詢系統。
字符 | 定義 |
---|---|
\d |
代表數字字符,意思等同於 [0-9] |
\w |
代表單詞字符,泛指英文、數字、下滑線 |
\s |
代表空白及換行字符 |
\D |
代表非數字字符,意思等同於 ^[0-9] |
\W |
代表非單詞字符 |
\s |
代表非空白及換行字符 |
. |
代表任意字符,但不包含換行字符 |
透過這些簡單的正則表達式語法,我們可以很好的運用它們在 R 語言中進行文字資訊的抓取,接下來我們會在下一篇文章中提到關於正則表達式的進階應用。