【问题标题】:R - How to make a stringi str_extract pattern parametric in a loopR - 如何在循环中使 stringi str_extract 模式参数化
【发布时间】:2020-06-09 17:39:24
【问题描述】:

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

【问题讨论】:

  • 如果您存储模式。作为。一个向量pat <- c("(.*/)", "\\d+"); lst1 <- vector('list', length(pat)); for(i in seq_along(pat) lst1[[i]] str_extract(yourvector, pat[i])
  • 这里,和/分开
  • @WiktorStribiżew 您的意思是拆分然后根据需要将它们粘贴到循环中?

标签: r regex stringi


【解决方案1】:

我们可以使用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"

【讨论】:

  • 你能去掉结果中的最后一个正斜杠吗?应该修改正则表达式
  • @lbo 我正在使用你的正则表达式
  • @akurn 我知道,我想不出一个正则表达式来摆脱最后一个斜线,我不想让问题变得复杂
【解决方案2】:

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/"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多