如何在R中使用带有`grep`的引用?

时间:2011-06-01 09:56:25

标签: regex r grep gsub

我正在寻找一种使用R中的正则表达式返回引用的优雅方法。我解释一下:

假设我想找到以月名开头的字符串:

x <- c("May, 1, 2011", "30 June 2011")
grep("May|^June", x, value=TRUE)
[1] "May, 1, 2011"

这有效,但我真的想隔离月份(即“五月”,而不是整个匹配的字符串。

因此,可以使用gsub使用substitute参数返回后向引用。但这有两个问题:

  1. 你必须将模式包装在“。*(pattern)。*)”中,以便在整个字符串上进行替换。
  2. 而不是为非匹配字符串返回NA,gsub返回原始字符串。这显然不是我想要的:
  3. 代码和结果:

    gsub(".*(^May|^June).*", "\\1", x) 
    [1] "May"          "30 June 2011"
    

    我可以通过执行各种额外检查来编写解决方法,但这很快就会变得非常混乱。

    为了清楚起见,理想的结果应该是:

    [1] "May"          NA
    

    有没有简单的方法来实现这个目标?

3 个答案:

答案 0 :(得分:20)

regexprgrep类似,但会返回每个字符串中(第一个)匹配的位置和长度:

> x <- c("May, 1, 2011", "30 June 2011", "June 2012")
> m <- regexpr("May|^June", x)
> m
[1]  1 -1  1
attr(,"match.length")
[1]  3 -1  4

这意味着第一个字符串的长度为3,匹配位置1,第二个字符串不匹配,第三个字符串的长度为4,位置为1。

要提取匹配项,您可以使用以下内容:

> m[m < 0] = NA
> substr(x, m, m + attr(m, "match.length") - 1)
[1] "May"  NA     "June"

答案 1 :(得分:9)

stringr包具有完全用于此目的的功能:

library(stringr)
x <- c("May, 1, 2011", "30 June 2011", "June 2012")
str_extract(x, "May|^June")
# [1] "May"  NA     "June"

它是regexpr的一个相当薄的包装器,但是stringr通常通过比基本R函数更一致来使字符串处理更容易。

答案 2 :(得分:3)

gsubfn包比grep和regexpr函数更通用,并且有办法让你返回backrefrence,参见strapply函数。