【问题标题】:Detecting whole words using str_detect() in R在 R 中使用 str_detect() 检测整个单词
【发布时间】:2020-06-17 13:43:53
【问题描述】:

我在 R 中有一个字符串:

c("FLT1", "FLT1P1", "FLT1-FLT2", "SGY-FLT1, GPD")

我想保留所有具有 FLT1 但在添加其他 字母数字 字符时的匹配项。换句话说,我想保留除第二个之外的所有条目,因为它们都提到了 FLT1,但第二个提到了 FLT1P1。

当我使用 str_detect 时,它会将所有内容都返回为 true:

str_detect(string, "FLT1")
[1] TRUE TRUE TRUE TRUE

谁能建议只退回提到 FLT1 的项目的最佳方法?

【问题讨论】:

  • 你可以锚定你的正则表达式
  • 不要将正则表达式用于全字符串完全匹配。 string == "FLT1"
  • 如果我使用 string == "FLT1" 它会错过诸如 "FLT1-FLT2" 之类的条目
  • 好的,所以当你使用 “但不是在添加其他字符时” 时,你的字符定义中似乎没有包含 "-"。您的意思是“但不是在添加其他字母时”? “......不是其他字母和数字”? “除了“-”之外还有别的吗?还有别的吗?
  • 你可以试试str_detect(string, "FLT1(\\W|$)"),在FLT1之后不指定字母数字字符(即不是字母数字或字符串结尾的字符)

标签: r stringr


【解决方案1】:

可能 带有\\b 的单词边界会起作用。它们匹配字符串的开头或结尾以及与任何非数字、字母或下划线字符之间的转换。

str_detect(string, "\\bFLT1\\b")
[1]  TRUE FALSE  TRUE  TRUE

【讨论】:

    【解决方案2】:

    使用环视

    library(stringr)
    
    x <- c("FLT1", "FLT1P1", "FLT1-FLT2", "SGY-FLT1, GPD","AFLT1")
    
    x %>% 
      str_detect("(?<![:alpha:])FLT1(?![:alpha:])")
    #> [1]  TRUE FALSE  TRUE  TRUE FALSE
    

    reprex package (v0.3.0) 于 2020 年 6 月 17 日创建

    【讨论】:

      【解决方案3】:

      “没有添加其他字符”对我来说意味着由\\b表示的单词边界。

      x <- c("FLT1", "FLT1P1", "FLT1-FLT2", "SGY-FLT1, GPD")
      stringr::str_detect(x, "FLT1\\b")
      # [1]  TRUE FALSE  TRUE  TRUE
      

      或基础R:

      grepl("FLT1\\b", x)
      # [1]  TRUE FALSE  TRUE  TRUE
      

      【讨论】:

        【解决方案4】:

        正如其他人所指出的,最好的方法是使用\\b。 或者,您可以使用积极的前瞻:

        数据:

        x <- c("FLT1", "FLT1P1", "FLT1-FLT2", "SGY-FLT1, GPD")
        

        解决方案:

        grep("FLT1(?=$|-|,)", x, perl = T, value = T)
        [1] "FLT1"          "FLT1-FLT2"     "SGY-FLT1, GPD"
        

        这里,grepmatches FLT1 如果,并且仅当紧接的下一个是字符串的结尾 ($) 或 -,。暗示,当紧接的下一个字符是(例如,字母数字)时,它不匹配。

        或者,如果规则是您要排除添加了字母数字字符的值,您可以使用 negative 前瞻:

        grep("FLT1(?!\\w)", x, perl = T, value = T)
        [1] "FLT1"          "FLT1-FLT2"     "SGY-FLT1, GPD"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-14
          • 2022-10-19
          • 1970-01-01
          • 2016-11-23
          • 1970-01-01
          • 1970-01-01
          • 2016-01-11
          相关资源
          最近更新 更多