2

对于此代码:

> grep("abc","abcabcabc", value=FALSE)
[1] 1

我认为它会给我字符串中出现“abc”的所有索引。难道我做错了什么?我应该使用其他方法来查找字符串中所有出现的模式吗?

4

2 回答 2

11

改用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)
于 2012-12-06T15:27:51.933 回答
4

grep仅返回找到匹配项的索引值。

x <- c('a', 'b', 'aa', 'abc', 'bc')

grep('a', x)
# [1] 1 3 4

您也可以使用value = TRUE返回grep匹配项而不是索引。

根据您的用例,您希望使用gsubgregexpr。所有这些功能的帮助都包含在同一页面上,?grep.

于 2012-12-06T15:28:03.930 回答