R - Как сделать параметр шаблона stringi str_extract c в цикле - PullRequest
1 голос
/ 26 февраля 2020

У меня есть строки, которые сегментированы косой чертой, я пытаюсь сгенерировать это, используя al oop, поэтому мне нужно параметризовать регулярное выражение, чтобы я мог использовать его внутри al oop. У меня есть 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}"

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Мы можем использовать 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"

Если нам нужно это как al oop

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"
1 голос
/ 26 февраля 2020

Использование regex в base вместе с for l oop:

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-l oop) для получения желаемых результатов:

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/"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...