对于此代码:
> grep("abc","abcabcabc", value=FALSE)
[1] 1
我认为它会给我字符串中出现“abc”的所有索引。难道我做错了什么?我应该使用其他方法来查找字符串中所有出现的模式吗?
对于此代码:
> grep("abc","abcabcabc", value=FALSE)
[1] 1
我认为它会给我字符串中出现“abc”的所有索引。难道我做错了什么?我应该使用其他方法来查找字符串中所有出现的模式吗?
改用gregexpr()
:
gregexpr("abc","abcabcabc")
[[1]]
[1] 1 4 7
attr(,"match.length")
[1] 3 3 3
attr(,"useBytes")
[1] TRUE
这告诉您在位置 1、4 和 7 有匹配项。每个匹配项的长度为 3 个字符。
如果您只想打印匹配的位置,而不需要其他属性,请使用以下技巧:
x <- gregexpr("abc","abcabcabc")
lapply(x, c)
[[1]]
[1] 1 4 7
这利用了c()
从所有参数中去除属性的事实。因此,您使用lapply
遍历列表,将每个元素传递给c()
并返回没有其属性的相同元素。
好的,我刚刚被代理雷普利。
不要使用lapply(x, c)
. 改为这样做:
lapply(x, as.vector)
[[1]]
[1] 1 4 7
原因见fortune(185)
library(fortunes)
fortune(185)
I don't like to see the use of c() for its side effects. In this case Marc's
as.vector seems to me to be self-explanatory, and that is a virtue in programming
that is too often undervalued.
-- Brian D. Ripley (on how to convert a matrix into a vector)
R-help (March 2007)
grep
仅返回找到匹配项的索引值。
x <- c('a', 'b', 'aa', 'abc', 'bc')
grep('a', x)
# [1] 1 3 4
您也可以使用value = TRUE
返回grep
匹配项而不是索引。
根据您的用例,您希望使用gsub
或gregexpr
。所有这些功能的帮助都包含在同一页面上,?grep
.