如何在R中使用带参数的grep?

Mat*_*ert 1 regex grep r

显然,我没有得到grep在R中的工作方式.如果我在OS X终端上使用grep,我可以使用参数-o,这使得grep只返回匹配的部分.在R中,我找不到如何做相应的事情.阅读手册我认为值是正确的方法,这更好,因为它返回字符而不是索引,但仍返回整个字符串.

# some string  fasdjlk465öfsdj123 
# R
test <-  fasdjlk465öfsdj123 
grep("[0-9]",test,value=TRUE) # returns  "fasdjlk465öfsdj123"

# shell
grep -o '[0-9]' fasdjlk465öfsdj123
# returns 4 6 5 1 2 3
Run Code Online (Sandbox Code Playgroud)

R中缺少的参数是什么?

编辑:Joris Meys的建议非常接近我想要做的事情.我得到一个矢量作为readLines的结果.我想检查向量的每个元素是否有数字并返回这些数字.我真的很惊讶没有标准的解决方案.我想过使用一些可以在字符串上运行的regexp函数并像grep -o一样返回匹配,然后在该向量上使用lapply.grep.custom最接近 - 我会尽力为我工作.

Spa*_*man 5

这是因为R的'grep'适用于向量 - 它将对每个元素进行搜索并返回匹配的元素索引.它说'这个矢量中的哪些元素符合这个模式?' 例如,在这里我们制作一个3的向量,然后问'这个向量中哪些元素中有一个数字?'

> test = c("fasdjlk465öfsdj123","nonumbers","123")
> grep("[0-9]",test)
[1] 1 3
Run Code Online (Sandbox Code Playgroud)

元素1和3 - 不是2,只是字符.

你可能想要gsub - 替换任何与数字不匹配的东西:

> gsub("[^0-9]","",test)
[1] "465123" ""       "123" 
Run Code Online (Sandbox Code Playgroud)


Jor*_*eys 5

Spacedman已经说过了.如果你真的想在shell中模拟grep,你必须使用strsplit()以下方法处理字符本身:

> chartest <- unlist(strsplit(test,""))
> chartest
 [1] "f" "a" "s" "d" "j" "l" "k" "4" "6" "5" "ö" "f" "s" "d" "j" "1" "2" "3"
> grep("[0-9]",chartest,value=T)
[1] "4" "6" "5" "1" "2" "3"
Run Code Online (Sandbox Code Playgroud)

编辑:

正如Nico所说,如果你想为完整的正则表达式做这个,你需要使用gregexpr()substr().我会像这样制作一个自定义函数:

grep.custom <- function(x,pattern){
    strt <- gregexpr(pattern,x)[[1]]
    lngth <- attributes(strt)$match.length
    stp <- strt + lngth - 1
    apply(cbind(strt,stp),1,function(i){substr(x,i[1],i[2])})
}
Run Code Online (Sandbox Code Playgroud)

然后 :

> grep.custom(test,"sd")
[1] "sd" "sd"
> grep.custom(test,"[0-9]")
[1] "4" "6" "5" "1" "2" "3"
> grep.custom(test,"[a-z]s[a-z]")
[1] "asd" "fsd"
Run Code Online (Sandbox Code Playgroud)

编辑2:

对于向量,使用该函数Vectorize(),例如:

> X <- c("sq25dfgj","sqd265jfm","qs55d26fjm" )
> v.grep.custom <- Vectorize(grep.custom)
> v.grep.custom(X,"[0-9]+")
$sq25dfgj
[1] "25"

$sqd265jfm
[1] "265"

$qs55d26fjm
[1] "55" "26"
Run Code Online (Sandbox Code Playgroud)

如果你想从shell调用grep,请参阅 ?system