Как применить список шаблонов регулярных выражений в списке - PullRequest
1 голос
/ 04 февраля 2020

У меня есть список строк и список шаблонов, таких как:

links <- c(
"http://www.google.com"
,"google.com"
,"www.google.com"
,"http://google.com"
,"http://google.com/"
,"www.google.com/#"
,"www.google.com/xpto"
,"http://google.com/xpto"
,"http://google.com/xpto&utml"
,"www.google.com/gclid=102938120391820391+ajdakjsdsjkajasn_JAJSDSJA")

patterns <- c(".com$","/$")

я хочу стереть все ссылки, которые соответствуют этим шаблонам. и получить этот результат:

"www.google.com/#"
"www.google.com/xpto"
"http://google.com/xpto"
"http://google.com/xpto&utml"
"www.google.com/gclid=102938120391820391+ajdakjsdsjkajasn_JAJSDSJA"

если я использую

x<-lapply (patterns, grepl, links) 

я получу

[[1]]
 [1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE

[[2]]
 [1] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE

, что приводит меня к этим 2 спискам

> links[!x[[2]]]
[1] "http://www.google.com"                                             "google.com"                                                       
[3] "www.google.com"                                                    "http://google.com"                                                
[5] "www.google.com/#"                                                  "www.google.com/xpto"                                              
[7] "http://google.com/xpto"                                            "http://google.com/xpto&utml"                                      
[9] "www.google.com/gclid=102938120391820391+ajdakjsdsjkajasn_JAJSDSJA"


> links[!x[[1]]]
[1] "http://google.com/"                                                "www.google.com/#"                                                 
[3] "www.google.com/xpto"                                               "http://google.com/xpto"                                           
[5] "http://google.com/xpto&utml"                                       "www.google.com/gclid=102938120391820391+ajdakjsdsjkajasn_JAJSDSJA"

в этом случае каждый список результатов уничтожил 1 шаблон ... но я хотел 1 список со всеми шаблонами ... как применить регулярное выражение только к одному результату ... или как-то объединить n логических векторов, всегда выбирая true , как:

b[1] <- c(TRUE,FALSE,FALSE,TRUE,FALSE)
b[2] <- c(FALSE,FALSE,TRUE,TRUE,FALSE)
b[3] <- c(FALSE,FALSE,FALSE,FALSE,FALSE)

res <- somefunction(b)
res 
TRUE,FALSE,TRUE,TRUE,FALSE

Ответы [ 4 ]

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

В большинстве случаев лучшим решением будет объединение шаблонов регулярных выражений и применение поиска по одному шаблону , как показано в ответе Томаса .

Однако это также тривиально объединять логические векторы, комбинируя их с логическими операциями. В вашем случае вы хотите вычислить логический дизъюнкт для каждого члена *1006*. Между двумя векторами это может быть вычислено как x | y. Между списком нескольких векторов он может быть вычислен с использованием Reduce( | , logical_list).

В вашем случае это приводит к:

any_matching = Reduce(`|`, lapply(patterns, grepl, links))
result = links[! any_matching]
2 голосов
/ 04 февраля 2020

Это должно делать то, что вы хотите:

links[!sapply("(\\.com|/)$", grepl, links)]

Объяснение:

Вы можете использовать sapply, чтобы получить вектор, а не список

I ' d использовать шаблон "(\\.com|/)$" (т.е. заканчивается на .com OR /).

В конце я отменяю результирующий логический вектор, используя !.

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

Вы можете попробовать приведенный ниже базовый код R, используя grep

r <- grep(paste0(patterns,collapse = "|"),links,value = TRUE,invert = TRUE)

, такой что

> r
[1] "www.google.com/#"                                                 
[2] "www.google.com/xpto"                                              
[3] "http://google.com/xpto"                                           
[4] "http://google.com/xpto&utml"                                      
[5] "www.google.com/gclid=102938120391820391+ajdakjsdsjkajasn_JAJSDSJA"
0 голосов
/ 04 февраля 2020

Вы можете сделать это, используя функцию stringr::str_subset().

library(stringr)

str_subset(links, pattern = ".com$|/$", negate = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...