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] 由于暂时不懂的正则表达式,暂时无法完全理解这两个的作用

你可能感兴趣的:(R)