R str_match正则表达式之间(和=

时间:2018-03-18 16:59:31

标签: r regex dplyr

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

完整字符串如下:

 Chemical: (BETA-CYFLUTHRIN = 118831)

我只想要'BETA-CYFLUTHRIN'所以我正在尝试使用正则表达式来获取值(和=但我已经得到了

(BETA-CYFLUTHRIN =

我知道这可能是一个非常愚蠢的问题,但我一直在努力解决这个问题,但仍然看不到它。这是我到目前为止:有什么建议吗?谢谢!

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

2 个答案:

答案 0 :(得分:1)

改为使用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中的正则表达式函数确实非常有用。

答案 1 :(得分:1)

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

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

模式匹配:

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

<强> See the regex demo

基础R等价物可能看起来像

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

查看R demo online