R - 如何在循环中制作一个 stringi str_extract 模式参数

R - How to make a stringi str_extract pattern parametric in a loop

我有由正斜杠分割的字符串,我正在尝试使用循环生成它,因此我需要对正则表达式进行参数化,以便我可以在循环中使用它。我有 7 个级别:

我想使用正则表达式和 stringi 提取以下内容:

A
A/268
A/268/200
A/268/200/300
A/268/200/300/400

这是我的:

n=3
str_extract("A/268/200/300/400/500","(.*?/){n}"


str_extract("A/268/200/300/400/500","(.*?/){3}"

我们可以使用glue::glue来插入值

n <- 3
pat <- as.character(glue::glue("(.*?/){<-n-1->}([^/]+)", 
               .open = "<-", .close = "->"))
pat
#[1] "(.*?/){2}([^/]+)"
library(stringr)
str_extract("A/268/200/300/400/500", pat)
#[1] "A/268/200"

如果我们需要它作为一个循环

v1 <- 1:7
lst1 <- vector('list', length(v1))
for(i in v1) {
   tmppat <- as.character(glue::glue("(.*?/){<-i-1->}([^/]+)",
                   .open = "<-", .close = "->"))
   lst1[[i]] <- str_extract("A/268/200/300/400/500", tmppat)
 }





head(lst1, 5)
#[[1]]
#[1] "A"

#[[2]]
#[1] "A/268"

#[[3]]
#[1] "A/268/200"

#[[4]]
#[1] "A/268/200/300"

#[[5]]
#[1] "A/268/200/300/400"

base 中使用 regex 以及 for 循环:

for (n in 1:lengths(regmatches("A/268/200/300/400/500" , 
                                gregexpr("/", "A/268/200/300/400/500")))) {

  print(gsub(paste0("^(?:[^/]*\K/){",n,"}.*"), "", "A/268/200/300/400/500", perl = TRUE))
}

#> [1] "A"
#> [1] "A/268"
#> [1] "A/268/200"
#> [1] "A/268/200/300"
#> [1] "A/268/200/300/400"

第一个解法:

base中,我们可以制作一个regex模式并更改n(可能在for循环中)以提取所需的结果:

N <- lengths(regmatches("A/268/200/300/400/500" , gregexpr("/", "A/268/200/300/400/500")))
n <- 3

strsplit("A/268/200/300/400/500",paste0("([^/]+)(?:/[^/]+){",N-n,"}$"))
#> [[1]]
#> [1] "A/268/200/"