如何在R的stringr中正确使用正则表达式语句

时间:2018-04-05 17:17:34

标签: r regex stringr

如何根据特定模式使用stringr提取特定字符。

例如,如果我在一个整洁的模型表中有以下系数:

I(pmax(0,hp - 100))

我想用hp和100创建另外两列。

示例代码:

library(tidyverse)
library(broom)
library(stringr)

 #pull in and gather data

mtcars1 <- as_tibble(mtcars)
mtcars1$cyl <- as.factor(mtcars$cyl)
#run model and produce model-summary table
model <- glm(mpg ~ cyl + hp + I(pmax(0, hp - 100)), data = mtcars1)

model_summary <- tidy(model)

如何根据特定模式使用stringr提取特定字符。

例如,如果我在一个整洁的模型表中有以下系数:

I(pmax(0,hp - 100))

我想用hp和100创建另外两列。

我在regex101.com上尝试了以下工作(特定正则表达式声明),但在r中没有。

model_summary_hp <- model_summary %>%
  mutate(term1 = str_extract(term, regex("\I\(pmax\(0, ([a-z]+)\ - 100\)\)")),
     knot =  str_extract(term, regex("\I\(pmax\(0, [a-z]+ - ([0-9]+)\)\)")))

我收到以下错误:

Error: '\I' is an unrecognized escape in character string starting ""\I"

我不确定为什么它不能识别正则表达式语句。

1 个答案:

答案 0 :(得分:1)

一个非常重要的事情是了解如何使用正则表达式在线测试程序:如果您在那里看到某些内容,并不意味着它在目标环境中的工作方式相同。由于您使用的是stringr函数,因此必须确保您的模式与ICU引擎兼容,而regex101仅支持PCRE,JS,Python re和Go正则表达式引擎。请注意,如果您使用(g)sub,则必须确保正则表达式与TRE正则表达式引擎或PCRE兼容(添加perl=TRUE时)。

现在,您需要提取2个值,这意味着您需要使用2个str_extractsub个调用。

stringr方法:

1) "(?<=I\\(pmax\\(0, )[a-z]+"          # or
   "(?<=I\\(pmax\\(0,\\s{0,10})[a-z]+"

2) "\\d+(?=\\)\\))"

此处,主要观点是:(?<=I\\(pmax\\(0, )匹配当前位置左侧的I(pmax(0,,但不会将匹配的文本放入匹配值中。 (?=\\)\\))模式是一个积极的预测,需要在当前位置的右侧立即显示))

请注意,第一个正则表达式的第二个版本在regex101.com上不起作用,因为lookbehind模式在这里是约束宽度,而不是固定宽度。

sub方法(TRE正则表达式):

1) sub("I\\(pmax\\(\\d+,\\s*([a-z]+)\\s*-\\s*\\d+\\)\\)","\\1", term)

2) sub("I\\(pmax\\(\\d+,\\s*[a-z]+\\s*-\\s*(\\d+)\\)\\)","\\1", term)

此处,重点是匹配整个字符串,捕获您需要的内容,并将占位符替换为此组\1