代码之家  ›  专栏  ›  技术社区  ›  Jordan

如何在R的stringr中正确使用regex语句

  •  1
  • Jordan  · 技术社区  · 7 年前

    如何基于特定模式使用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上有效的方法(特定的regex语句)。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"

    我不知道为什么它不识别regex语句。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Wiktor Stribiżew    7 年前

    一件非常重要的事情是了解如何使用regex在线测试仪:如果您在那里看到一些东西,并不意味着它在您的目标环境中也能工作。因为您正在使用 stringr 函数,您必须确保模式与ICU引擎兼容,而regex101仅支持PCRE、JS、Python re 还有regex引擎。注意如果你使用 (g)sub 您必须确保regex与TRE regex引擎或PCRE兼容(添加时 perl=TRUE )。

    现在,您需要提取2个值,这意味着您需要使用2 str_extract sub 呼叫。

    A. stringr公司 方法:

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

    这里的要点是环顾四周: (?<=I\\(pmax\\(0, ) 匹配项 I(pmax(0, 紧靠当前位置的左侧,但不会将匹配的文本放入匹配值中。这个 (?=\\)\\)) 模式是一种积极的前瞻,需要 )) 立即位于当前位置的右侧。

    请注意,第一个regex的第二个版本在regex101上不起作用。com,因为lookbehind模式在这里是受限制的宽度,而不是固定的宽度。

    A. 子系统 进近(TRE regex):

    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