Разделить повторный разделитель
Я пытаюсь использовать пакет stringi
для разделения на разделитель (возможно, разделитель повторяется), но сохраняйте разделитель. Это похоже на этот вопрос, который я задал луны назад: R разделить на разделитель (разделение) сохранить разделитель (разделение), но разделитель можно повторить. Я не думаю, что base strsplit
может обрабатывать этот тип регулярных выражений. Пакет stringi
может, но я не могу понять, как форматировать регулярное выражение, оно разбивается на разделитель, если есть повторы, а также не оставлять пустую строку в конце строки.
Решения Base R, stringr, stringi и т.д. все приветствуются.
Более поздняя проблема возникает из-за того, что я использую жадный *
на \\s
, но пространство не является обязательным, поэтому я мог только подумать, чтобы он его оставил:
MWE
text.var <- c("I want to split here.But also||Why?",
"See! Split at end but no empty.",
"a third string. It has two sentences"
)
library(stringi)
stri_split_regex(text.var, "(?<=([?.!|]{1,10}))\\s*")
# Результат
## [[1]]
## [1] "I want to split here." "But also|" "|" "Why?"
## [5] ""
##
## [[2]]
## [1] "See!" "Split at end but no empty." ""
##
## [[3]]
## [1] "a third string." "It has two sentences"
# Желаемый результат
## [[1]]
## [1] "I want to split here." "But also||" "Why?"
##
## [[2]]
## [1] "See!" "Split at end but no empty."
##
## [[3]]
## [1] "a third string." "It has two sentences"
Ответы
Ответ 1
Используя strsplit
strsplit(text.var, "(?<=[.!|])( +|\\b)", perl=TRUE)
#[[1]]
#[1] "I want to split here." "But also||" "Why?"
#[[2]]
#[1] "See!" "Split at end but no empty."
#[[3]]
#[1] "a third string." "It has two sentences"
Или
library(stringi)
stri_split_regex(text.var, "(?<=[.!|])( +|\\b)")
#[[1]]
#[1] "I want to split here." "But also||" "Why?"
#[[2]]
#[1] "See!" "Split at end but no empty."
#[[3]]
#[1] "a third string." "It has two sentences"
Ответ 2
Просто используйте шаблон, который находит межсимвольные местоположения, которые: (1) , которым предшествует один из ?.!|
; и (2) не, за которыми следует один из ?.!|
. Tack on \\s*
, чтобы соответствовать и съедать любое количество последовательных символов пробела, и вам хорошо идти.
## (look-behind)(look-ahead)(spaces)
strsplit(text.var, "(?<=([?.!|]))(?!([?.!|]))\\s*", perl=TRUE)
# [[1]]
# [1] "I want to split here." "But also||" "Why?"
#
# [[2]]
# [1] "See!" "Split at end but no empty."
#
# [[3]]
# [1] "a third string." "It has two sentences"