R: 字符查詢匹配和替換 grep(...) - Pattern Matching and Replacement

R語言中文本處理的重要一環,而R裏面最強大的文本處理公式就是grep()一類的general函數(無需添加任何新的package)。
grep的全稱是global search regular expression and print out the line,是Unix下一種強大的文本搜索工具,可以通過正則表達式搜索文本,並把匹配的行打印出來[1]

-+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-

R document裏,grep系列包含grep, grepl, sub, gsub, regexpr, gregexpr, regexec 7個主要函數。

-----------------------------------------------------------------------------------------------

這些公式的主要共用參數有:
  • pattern: 搜索標準。(可參考EXCEL中Match()函數的第一個參數lookup_value)
    • 可以是一個正則表達式,也可以是一個字符串,如果是字符串,則需明確fixed = TRUE (請看下文);
    • pattern的賦值會被轉換成字符格式(用as.character);
    • 如果pattern被賦值爲一個長度大於1的字符型向量,則函數只讀取第一個元素並提示警告信息;
    • 除regexpr和gregexpr以外,其它函數均可以查詢缺失值(NA, NaN, etc.)
  • x, text: 被搜索項。(可參考EXCEL中Match()函數的第二個參數lookup_array)
    • 可以是一個字符型向量,也可以是一個能夠被as.character轉換成字符向量的對象;
    • 長向量(LongVectors, 向量長度>=2^31)也可以作爲賦值項。
  • ignore.case: 默認值爲FALSE。F表示區分大小寫,T則表示不區分
  • perl: 默認爲F,選擇T表示使用Perl的正則表達式規則,功能更加強大[2]。
  • fixed: 精確匹配。(可參考EXCEL中Match()函數的第三個參數match_type)
    • 默認爲F。如果爲T,則表示精確查找(即不使用正則表達式規則)。
    • 這個參數在所有參數中優先級最高,如果有衝突,則以此參數賦值爲準。
  • useBytes: 字節匹配。默認爲F:按字符逐個查詢。如果爲T,則按字節逐個查詢(所以這個參數對中文,日文韓文這樣的字符來說是沒有作用的)。
另有三個獨特參數
  • invert: 只在grep(...)中使用。默認爲F,如果爲T,則返回不匹配的元素的座標或值,即查找pattern的補集
  • value: 只在grep(...)中使用默認爲F,如果爲T,則返匹配值的元素值(而非下標)
  • replacement: 顧名思義用於替換pattern,只在sub(...)和gsub(...)中使用
    • 替換項被自動轉換成字符格式;
    • 若fixed = F,則可包含如"\1","\9"這樣的字符[3];
    • 若只有perl = T,則可用"\U","\L"去將剩餘替代項轉換成大寫或者小寫,用”\E“去轉換end case[4];
    • 如果replacement是長度大於2的向量,則只有第一個元素被使用,並會彈出警告信息;
    • 如果replacement是NA,則所有對應匹配項的元素,都會被設置爲NA。
-----------------------------------------------------------------------------------------------

7個函數可以分爲3組
  • grep, grepl: 返回pattern的匹配項。
    • 前者返回匹配項目的下標;後者返回邏輯值,x長度有多少,就返回多少個邏輯值。
    • 如果添加一個value參數,賦值爲T,則返回匹配項的值。
> text <- c("Company", "Coworker", "Cooperation", "Can")
> grep("o", text)
[1] 1 2 3
> grepl("o", text)
[1]  TRUE  TRUE  TRUE FALSE
> grep("o", text, value = T)
[1] "Company"     "Coworker"    "Cooperation"
  • sub, gsub: 返回用replacement替換匹配項之後的x(字符型向量)。前者只替換向量中每個元素的第一個匹配值,後者替換所有匹配值。注意以下兩個例子中"o"的替換方式。
          > sub("o", "xx", text)
     [1] "Cxxmpany"     "Cxxworker"    "Cxxoperation" "Can" 
> gsub("o", "xx", text)
[1] "Cxxmpany"       "Cxxwxxrker"     "Cxxxxperatixxn" "Can"     
  • regexpr, gregexpr, regexec
    • regexpr: 應該是regular expression的縮寫。
      • 返回一個與x同樣長度的整數向量,標記vector中每個元素第一個匹配項的下標。-1表示沒有匹配;
      • match.length返回各匹配項長度,-1表示該元素非匹配項。
    • gresgexpr: 應該是general regular expression的縮寫
      • 返回一個list,x的長度是多少,list就有多少個元素;
      • list中每個元素的向量值對應x的中對應元素匹配pattern的所有下標
      • list中每個元素的形式都與regexpr的結果一樣。
    • regexec: 不知道是神馬的縮寫(假設exec是execuion吧)。
      • 相當於是regexpr的結果以list形式儲存。
     > regexpr("o", text)
     > gregexpr("o", text)
     > regexec("o", text)

-+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-

暫時還不熟悉正則表達式的相關用法,所以無法嘗試出grep( )更多精妙強大的地方,暫時只能學習到這裏。

-+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-

[1][2] 這兩句話是copy自lijian大神的博客:R中字符串處理和grep的用法

[3][4] 由於暫時不懂的正則表達式,暫時無法完全理解這兩個的作用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章