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/"
我有由正斜杠分割的字符串,我正在尝试使用循环生成它,因此我需要对正则表达式进行参数化,以便我可以在循环中使用它。我有 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/"