Likan Zhan

R 中字符串的查找和替换

战立侃 · 2018-07-01

  1. 假如我们有一个名字为 example 的向量。该向量包含了五个纯文本元素。其具体内容如下:
example <- c(
"The quick brown fox jumps over the lazy dog",
"The fat rat sat on a mat.",
"The frog and a rat sat on a mat.",
"The bat and a fat rat sat on a cat.",
"Colorless green ideas sleep furiously",
"The fat cat sat on the mat."
)

R中有一系列函数用于查找和替换一个字符串,例如,如果我们想知道字符串 .at (有关该字符串的具体含义,请参看 ?"regex")在向量 example 中出现的情况 如grepgreplregexprregexecgregexprsubgsub等。,则我们有以下函数可以选择:

  1. grep 函数返回原始向量中包含所要字符串的成分的所在位置:
grep(".at", example)
## [1] 2 3 4 6
  1. grepl 函数返回的是与原始向量长度一致的逻辑向量,表示原始向量中每一个成分是否包含了所要搜索的字符串:
grepl(".at", example)
## [1] FALSE  TRUE  TRUE  TRUE FALSE  TRUE
  1. regexpr 函数返回的是一个与原始长度相同的一个数值型向量,向量的每个成分表示搜索字符串在原始向量每一个成分中的出现位置。其中 -1 表示该成分中不存在要搜索的字符串:
reg <- regexpr(".at", example)
attributes(reg) <- NULL
reg
## [1] -1  5 16  5 -1  5
  1. regexec 函数返回的一个与原始向量长度一样的一个列表 (list)。列表的一个成分分别对应于原始向量的一个成分,用于表示搜索字符串在该成分中的首次出现位置:
reg <- regexec(".at", example)
do.call(qpcR:::rbind.na, reg)
##      [,1]
## [1,]   -1
## [2,]    5
## [3,]   16
## [4,]    5
## [5,]   -1
## [6,]    5
  1. gregexpr 函数返回的一个与原始向量长度一样的一个列表 (list)。列表的一个成分分别对应于原始向量的一个成分,用于表示搜索字符串在该成分中每次出现的位置:
reg <- gregexpr(".at", example)
do.call(qpcR:::rbind.na, reg)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]   -1   NA   NA   NA   NA
## [2,]    5    9   13   22   NA
## [3,]   16   20   29   NA   NA
## [4,]    5   15   19   23   32
## [5,]   -1   NA   NA   NA   NA
## [6,]    5    9   13   24   NA
  1. sub(pattern, replacement, x) 函数返回的是把向量 x 中每个成分中首次出现的符合正则表达式的pattern替换为replacement
sub(".at",  9, example)
## [1] "The quick brown fox jumps over the lazy dog"
## [2] "The 9 rat sat on a mat."                    
## [3] "The frog and a 9 sat on a mat."             
## [4] "The 9 and a fat rat sat on a cat."          
## [5] "Colorless green ideas sleep furiously"      
## [6] "The 9 cat sat on the mat."
  1. gsub(pattern, replacement, x) 函数返回的是把向量 x 中每个成分中所有出现的符合正则表达式的pattern替换为replacement
gsub(".at",  9, example)
## [1] "The quick brown fox jumps over the lazy dog"
## [2] "The 9 9 9 on a 9."                          
## [3] "The frog and a 9 9 on a 9."                 
## [4] "The 9 and a 9 9 9 on a 9."                  
## [5] "Colorless green ideas sleep furiously"      
## [6] "The 9 9 9 on the 9."