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

How to properly use a regex statement in R's stringr

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

例如,如果我在 tidy 模型中有以下系数 table:

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 提取特定字符。

例如,如果我在 tidy 模型中有以下系数 table:

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"

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

一件非常重要的事情是了解如何使用正则表达式在线测试器:如果您在那里看到某些东西,并不意味着它在您的目标环境中也能正常工作。由于您使用的是 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+(?=\)\))"

这里主要是lookarounds:(?<=I\(pmax\(0, )匹配紧邻当前位置左侧的I(pmax(0,,但不将匹配的文本放入匹配值中。 (?=\)\)) 模式是一个积极的前瞻,需要 )) 紧邻当前位置的右侧。

请注意,第一个正则表达式的第二个版本在 regex101.com 时不起作用,因为这里的后视模式是 constrained-width,而不是 fixed-width。

一种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)

这里重点是匹配整个字符串,抓取你需要的,用占位符替换到这一组,.