r - 如何在 R 中使用带有 `grep` 的反向引用?

标签 r regex

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

假设我想查找以月份名称开头的字符串:

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

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

因此,可以使用 gsub使用 substitute 返回反向引用范围。但这有两个问题:
  • 您必须将模式包裹在 ".*(pattern).*)"中,以便替换发生在整个字符串上。
  • 而不是为不匹配的字符串返回 NA,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/

    相关文章:

    Java:使用模式和匹配器解析空格

    java - 有没有办法检查正则表达式是否代表 url

    r - 在R中的plotly饼图中使用自定义图标

    r - 在 R 中绘制家谱

    regex - 这个来自 todo.sh 的 sed 表达式有什么作用?

    php - 使用正则表达式在其之间和之后插入

    python - 使用正则表达式查找段落中出现特定短语后的所有名词短语

    r - 如何在R中实现countifs函数(excel)

    r - 具有 (1) ALL 和 (2) ANY 列大于特定值的子集行

    R封装方的随机森林对随机数据的拟合过度