我正在寻找一种在 R 中使用正则表达式返回引用的优雅方式。让我解释一下:
假设我想查找以月份名称开头的字符串:
x <- c("May, 1, 2011", "30 June 2011")
grep("May|^June", x, value=TRUE)
[1] "May, 1, 2011"
这有效,但我真的想隔离月份(即“May”,而不是整个匹配的字符串。
因此,可以使用
gsub
使用 substitute
返回反向引用范围。但这有两个问题:gsub
返回原始字符串。这显然不是我想要的:代码和结果:
gsub(".*(^May|^June).*", "\\1", x)
[1] "May" "30 June 2011"
我可能可以通过执行各种额外检查来编写解决方法,但这很快就会变得非常困惑。
明确地说,所需的结果应该是:
[1] "May" NA
有没有一种简单的方法来实现这一目标?
最佳答案
regexpr
类似于 grep
,但返回每个字符串中(第一个)匹配项的位置和长度:
> 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
这意味着第一个字符串在位置 1 处有一个长度为 3 的匹配,第二个字符串没有匹配,第三个字符串在位置 1 处有一个长度为 4 的匹配。
要提取匹配项,您可以使用以下内容:
> m[m < 0] = NA
> substr(x, m, m + attr(m, "match.length") - 1)
[1] "May" NA "June"
关于r - 如何在 R 中使用带有 `grep` 的反向引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6199350/