【问题标题】:R str_match regex between ( and =R str_match 介于 ( 和 = 之间的正则表达式
【发布时间】:2018-08-27 06:43:28
【问题描述】:

我在 R 的 dyplr 中使用 str_match 从列中提取字符串并将其放入新列中。

完整的字符串如下所示:

 Chemical: (BETA-CYFLUTHRIN = 118831)

我只想要“BETA-CYFLUTHRIN”,所以我尝试使用正则表达式来获取 ( 和 = 之间的值,但我已经得到了

(BETA-CYFLUTHRIN =

我知道这可能是一个非常愚蠢的问题,但我已经为此苦苦挣扎了一段时间,但仍然无法理解。这就是我到目前为止所拥有的:有什么建议吗?谢谢!

ru2 <- ru2%>%mutate(chem2 = str_extract(chem, "[(](.*?) ="))

【问题讨论】:

  • sub(".*\\((.*)\\s=.*","\\1","Chemical: (BETA-CYFLUTHRIN = 118831)")

标签: r regex dplyr


【解决方案1】:

您仍然可以使用str_extract,但您需要使用零宽度断言来仅在某些上下文中抓取模式的一部分:

str_extract(chem, "(?<=\\().*?(?= =)")

模式匹配:

  • (?&lt;=\\() - 当前位置左侧必须有一个 ( 字符
  • .*? - 匹配除换行符以外的任何 0+ 字符,尽可能少
  • (?= =) - 当前位置右侧必须有空格和=。

See the regex demo

一个基本的 R 等效项可能看起来像

regmatches(x, regexpr("(?<=\\().*?(?= =)", x, perl=TRUE))
# => [1] "BETA-CYFLUTHRIN"

查看R demo online。

【讨论】:

    【解决方案2】:

    改用str_match,并获取第二个值。你根本不需要改变你的模式:

    x <- "Chemical: (BETA-CYFLUTHRIN = 118831)"
    str_match(x, "[(](.*?) =")
         [,1]                 [,2]             
    # [1,] "(BETA-CYFLUTHRIN =" "BETA-CYFLUTHRIN"
    str_match(x, "[(](.*?) =")[1,2]
    # [1] "BETA-CYFLUTHRIN"
    

    之所以有效,是因为str_match 旨在提取捕获组(() 中的内容),这确实是 R 中正则表达式函数的一个非常有用的补充。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 2023-03-14
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多