Как разделить строки на основе условий в R? - PullRequest
5 голосов
/ 24 апреля 2019

Я бы хотел разделить одну строку на несколько строк, посмотрев на слова «разделить здесь», только если они существуют между «>» и «<», и не удаляя другие символы, кроме слов «разделить здесь» </p>

text <- c("Don't split here > yes here split here and blah blah < again don't (anything could be here) split here >")

Ожидаемый результат:

text[1] = "Don't split here > yes here "
text[2] = "and blah blah < again don't (anything could be here) split here >"

Я пытался

gsub(">(.*split here.*)<","", text)

, но это не работает.Может кто-то с регулярным выражением опыта.помочь мне здесь?

Ответы [ 3 ]

6 голосов
/ 24 апреля 2019

Замените необходимые строки на \ 1, а затем разделите на \ 1:

strsplit(gsub("(>[^<]+) split here ([^<]+<)", "\\1\1\\2", text), "\1")
## [[1]]
## [1] "Don't split here > yes here"             
## [2] "and blah blah < again don't split here >"

Если вход представляет собой символьный вектор, выводом будет список или, если вы хотите сгладить, просто используйте unlist(s), где s - результат вышеуказанной строки кода.

1 голос
/ 24 апреля 2019

Вы можете использовать простые strsplit, используя это регулярное выражение, используя оператор \K (используя perl = TRUE), чтобы получить нужные вам строки.

>[^>]*?\Ksplit here\s*(?=[^<]*<)

Regex Demo

Демоверсия кода R

strsplit("Don't split here > yes here split here and blah blah < again don't (anything could be here) split here >", ">[^>]*?\\Ksplit here\\s*(?=[^<]*<)", perl=TRUE)

печать

[[1]]
[1] "Don't split here > yes here "                                     
[2] "and blah blah < again don't (anything could be here) split here >"
0 голосов
/ 24 апреля 2019

Вы также можете сделать что-то вроде этого -

 > str_split(gsub(str_extract(text,"(?<=>).*?(?=\\<)"),gsub("split here","nsplit here",str_extract(text,"(?<=>).*?(?=\\<)")),text),"nsplit here")

ВЫХОД-

[[1]]
[1] "Don't split here > yes here "                                      
    " and blah blah < again don't (anything could be here) split here >"
...