2014-09-02 3 views
0

Скажем, у меня есть текст, как это:Split строка рекурсивно

pattern = "This_is some word/expression I'd like to parse:intelligently(using special symbols-like '.')" 

Задача состоит в том, чтобы разбить его на слова, используя разделители слов из семейства

c(" ","-","/","\\","_",":","(",")",".",",") 

.

Желаемый результат:

"This" "is" "some" "word" "expression" "I'd" "like" "to" "parse" "intelligently" "using" "special" "symbols" "like" 

Методы:

я мог бы сделать sapply или for петлю с помощью:

keywords = unlist(strsplit(pattern," ")) 
keywords = unlist(strsplit(keywords,"-")) 

# т.д.

Вопрос:

Но какое решение использует Reduce(f, x, init, accummulate=TRUE)?

ответ

4

Вы можете использовать опцию perl = TRUE, а затем разделить на пунктуации или пространстве

> strsplit(pattern, '[[:punct:]]|[[:space:]]', perl = TRUE) 
[[1]] 
[1] "This"   "is"   "some"   "word"   "expression" 
[6] "I"    "d"    "like"   "to"   "parse"   
[11] "intelligently" "using"   "special"  "symbols"  "like"   
[16] ""  
+0

действительно очень элегантный! –

+0

Это не дает желаемого результата, хотя ... –

+0

На самом деле я не против «I» + «d» против «Я бы». Для простоты я отредактирую желаемый результат в вопросе –

5

Здесь не нужно Reduce. Вы должны быть в состоянии сделать что-то вроде следующего:

splitters <- c(" ","/","\\","_",":","(",")",".",",","-") # dash should come last 
pattern <- paste0("[", paste(splitters, collapse = ""), "]") 
string <- "This_is some word/expression I'd like to parse:intelligently(using special symbols-like '.')" 
strsplit(string, pattern)[[1]] 
# [1] "This"   "is"   "some"   "word"   
# [5] "expression" "I'd"   "like"   "to"   
# [9] "parse"   "intelligently" "using"   "special"  
# [13] "symbols"  "like"   "'"    "'" 

Обратите внимание, что в регулярных выражений класса персонажу - должен прийти первым или последним, поэтому я отредактировали вектор «раскольников» соответственно. Кроме того, вы можете добавить + в конце вашего «шаблона», если вы хотите свернуть, скажем, несколько пробелов в один.

+0

@DavidArenburg, это ближе. – A5C1D2H2I1M1N2O1R2T1

+0

очень полезно в случае, если нужно добавить настройку к другому ответу –

+0

по какой-либо причине, почему «черта должна быть последней»? –

2

Я бы с (Он будет держать "I'd" вместе)

strsplit(pattern, "[^[:alnum:][:digit:]']") 
## [[1]] 
## [1] "This"   "is"   "some"   "word"   "expression" "I'd"   "like"   "to"   "parse"   
## [10] "intelligently" "using"   "special"  "symbols"  "like"   "'"    "'"