Извлечь строку слов между несколькими указанными c словами в R - PullRequest
2 голосов
/ 17 февраля 2020

У меня есть длинная строка, которая включает одно или несколько ключевых слов, в данном случае "Realm". Я использовал gsub, но он принимает слова только после последнего из ключевых слов.

, чтобы строка могла выглядеть следующим образом:

...Attributes \r\n Realm - Afrotropical \r\n IUCN Ecosystem -- Terrestrial biome...

или

...Attributes \r\n Realm - Afrotropical \r\n Realm - Neotropical \r\n . IUCN Ecosystem -- Terrestrial biome...

Я использую функцию :

Realm_fun<-function(x){gsub('^.*Realm -\\s*|\\s*IUCN Ecosystem.*$', '', x)}

, затем используйте lapply, чтобы развеселить все струны.

что я могу сделать, чтобы получить Afrotropical для первой строки и Afrotropical , Neotropical для второй?

Ответы [ 3 ]

1 голос
/ 17 февраля 2020

Я не знаю, как именно вам нужны слова, чтобы быть. Но одна идея может быть:

  regmatches(st, gregexpr("Realm - \\K(\\w+)",st,perl = TRUE))
[[1]]
[1] "Afrotropical"

[[2]]
[1] "Afrotropical" "Neotropical" 

Если вы не хотите разделять слова:

trimws(gsub("(?m)^.*Realm - (\\w+)|((?!Realm).)*$","\\1 ",st,perl=TRUE))

[1] "Afrotropical"                "Afrotropical  \nNeotropical"

gsub("(?m)^(?:(?!Real).)*$|[\r\n]|.*Realm - ","",st, perl = TRUE)

[1] "Afrotropical  "              "Afrotropical  Neotropical  "
0 голосов
/ 17 февраля 2020

Используйте базовые функции gregexpr и regmatches.

library(magrittr)

test<-c("...Attributes  \r\n      Realm - Afrotropical  \r\n  IUCN Ecosystem -- Terrestrial biome...","...Attributes  \r\n      Realm - Afrotropical  \r\n   Realm - Neotropical  \r\n .  IUCN Ecosystem -- Terrestrial biome...")

test %>% gregexpr("(?<=(Realm - ))[a-zA-Z]+", ., perl = T) %>% regmatches(x = test) 

#[[1]]
#[1] "Afrotropical"

#[[2]]
#[1] "Afrotropical" "Neotropical"                                                         
0 голосов
/ 17 февраля 2020

Вы можете попробовать это:

stringi::stri_extract_last(st, regex='(?<=Realm - )(\\w+)')

stri_extract_last извлечет последнее совпадение для регулярного выражения, используя взгляд за утверждениями, мы можем собрать слова, а затем оглянуться вокруг (используя положительный взгляд в этом случае ), в этом случае у вас есть слова Afrotropical и Neotropical , за которыми следует Realm - .

В случае, если вы хотите извлечь обе строки для последнего матча вы можете попробовать ниже (stri_extract_all):

stringi::stri_extract_all(st, regex='(?<=Realm - )(\\w+)')

Вход :

st <- c("...Attributes  \r\n      Realm - Afrotropical  \r\n  IUCN Ecosystem -- Terrestrial biome...", 
"...Attributes  \r\n      Realm - Afrotropical  \r\n   Realm - Neotropical  \r\n .  IUCN Ecosystem -- Terrestrial biome..."
)

Выход :

> stringi::stri_extract_last(st, regex='(?<=Realm - )(\\w+)')
[1] "Afrotropical" "Neotropical" 


> stringi::stri_extract_all(st, regex='(?<=Realm - )(\\w+)')
[[1]]
[1] "Afrotropical"

[[2]]
[1] "Afrotropical" "Neotropical" 
...