正規表示式Regular Expression in R

什麼是正規表示式?

Regular Expression (正規表示式)是指一組能用來表示字串共同格式 (common structure)的樣式 (Pattern),像是@符號會固定出現在email中,或是手機號碼固定是10碼,等等樣式。 在所有的程式語言中,只要用到字串比對字串取代等字串相關功能,都會用到正規表示式。雖然正規表示式在不同程式語言中會有些許差異,但核心概念是相同的。

以下是常見的範例:

語法 正則表達式 範例
整數 [0-9]+ 5815
浮點數 [0-9]+.[0-9]+ 58.15
純英文字串 [A-Za-z]+ CGUIM
Email [a-zA-Z0-9]+@[a-zA-Z0-9.]+ im@mail.cgu.edu.tw
URL http://[a-zA-Z0-9./_]+ http://www.is.cgu.edu.tw/

可以用正規表示式的R函數

  • grep()
  • grepl()
  • gsub()
  • str_split()
  • stringr package中的諸多函數

正規表示式的語法

逃脫字元

*\*

表示數量的語法

  • *: 出現0~無限多次
  • +: 出現1~無限多次
  • ?: 出現0~1次
  • {n}: 出現n次
  • {n,}: 出現n~無限多次
  • {n,m}: 出現n~m次
stringVector<-c("a","abc","ac","abbc","abbbc","abbbbc")
grep("ab*",stringVector,value=T)
## [1] "a"      "abc"    "ac"     "abbc"   "abbbc"  "abbbbc"
grep("ab+",stringVector,value=T)
## [1] "abc"    "abbc"   "abbbc"  "abbbbc"
grep("ab?c",stringVector,value=T)
## [1] "abc" "ac"
grep("ab{2}c",stringVector,value=T)
## [1] "abbc"
grep("ab{2,}c",stringVector,value=T)
## [1] "abbc"   "abbbc"  "abbbbc"
grep("ab{2,3}c",stringVector,value=T)
## [1] "abbc"  "abbbc"

表示位置的語法

  • ^: 出現在字串開始的位置
  • $: 出現在字串結束ˇ的位置
  • \b: 出現空字串(空白)開始或結束的位置
  • \B: 出現非字串開始或結束的位置
stringVector<-c("abc","bcd","cde","def","abc def","bcdefg abc")
grep("^bc",stringVector,value=T)
## [1] "bcd"        "bcdefg abc"
grep("bc$",stringVector,value=T)
## [1] "abc"        "bcdefg abc"
grep("\\bde",stringVector,value=T)
## [1] "def"     "abc def"
grep("\\Bde",stringVector,value=T)
## [1] "cde"        "bcdefg abc"

運算子

  • .: 出現所有的字元一次,包括空字串
  • [...]: 出現字元清單(…)中的字元一次,可用-表示範圍,如[A-Z][a-z][0-9]
  • [^...]: 不出現字元清單(…)中的字元
  • \: 要搜尋字串中的特殊字元時,前方須加上\
  • |: 或
stringVector<-c("03-2118800","02-23123456","0988123456",
                "07-118","0-888","csim@mail.cgu.edu.tw","csim@.","csim@",
                "http://www.is.cgu.edu.tw/")
grep("[0-9]{2}-[0-9]{7,8}",stringVector,value=T)
## [1] "03-2118800"  "02-23123456"
grep("[0-9]{10}",stringVector,value=T)
## [1] "0988123456"
grep("02|03",stringVector,value=T)
## [1] "03-2118800"  "02-23123456"
grep("[a-zA-Z0-9_]+@[a-zA-Z0-9._]+",stringVector,value=T)
## [1] "csim@mail.cgu.edu.tw" "csim@."

特殊符號

  • \d: 數字,等於 [0-9]
  • \D: 非數字,等於 [^0-9]
  • [:lower:]: 小寫字,等於 [a-z]
  • [:upper:]: 大寫字,等於 [A-Z]
  • [:alpha:]: 所有英文字,等於 [[:lower:][:upper:]] or [A-z]
  • [:alnum:]: 所有英文字和數字,等於 [[:alpha:][:digit:]] or [A-z0-9]
  • \w: 文字數字與底線,等於 [[:alnum:]] or [A-z0-9]
  • \W: 非文字數字與底線,等於 [^A-z0-9_]
  • [:blank:]: 空白字元,包括空白和tab
  • \s: 空白字元,
  • \S: 非空白字元
  • [:punct:]: 標點符號 ! “ # $ % & ’ ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~.
stringVector<-c("03-2118800","02-23123456","0988123456",
                "07-118","0-888","csim@mail.cgu.edu.tw","http://www.is.cgu.edu.tw/")
grep("\\d{2}-\\d{7,8}",stringVector,value=T)
## [1] "03-2118800"  "02-23123456"
grep("\\d{10}",stringVector,value=T)
## [1] "0988123456"
grep("\\w+@[a-zA-Z0-9._]+",stringVector,value=T)
## [1] "csim@mail.cgu.edu.tw"

參考資料

曾意儒

長庚資管老師,教授R、數據分析等課程,研究領域為醫學資訊