2014-10-22 3 views
10

Я пытаюсь использовать пакет stringi для разделения на разделитель (возможно, разделитель повторяется), но сохраняйте разделитель. Это похоже на этот вопрос, который я задал луны назад: R split on delimiter (split) keep the delimiter (split), но разделитель можно повторить. Я не думаю, что база strsplit может обрабатывать этот тип регулярных выражений. Пакет stringi может, но я не могу понять, как форматировать регулярное выражение, оно разбивается на разделитель, если есть повторы, а также не оставлять пустую строку в конце строки.Сплит сохранить повторный разделитель

Решения Base R, stringr, stringi и т. Д. Все решения приветствуются.

Поздний проблема возникает потому, что я использую жадный * на \\s но пространство не garunteed, так что я мог думать только оставить его в:

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" 

ответ

7

Использование 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" 

Or

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" 
+0

Не могли бы вы объяснить, что такое '* SKIP' и' * F', и какие роли они играют в регулярном выражении? –

+0

@Josh O'Brien Спасибо за комментарии. На самом деле, '* SKIP'' * F' не нужны. Я использовал его ранее, когда я работал над кодом и не проверял его впоследствии. – akrun

+0

@akrun хорошая переработка. –

6

Просто использовать шаблон, который находит местоположения между символами, которые: (1) являются предшествует один от ?.!|; и (2) не, а затем один из ?.!|. Tack на \\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" 
+0

Вы показали мне, где мое мышление регулярного выражения было неправильным, что является огромной помощью для обучения. Подход akrun немного более краток. +1 –

Смежные вопросы