如何在 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_extract
或 sub
调用。
一个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)
这里重点是匹配整个字符串,抓取你需要的,用占位符替换到这一组,
.
我如何根据特定模式使用 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_extract
或 sub
调用。
一个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)
这里重点是匹配整个字符串,抓取你需要的,用占位符替换到这一组,.