Разделить повторный разделитель

Я пытаюсь использовать пакет 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"