2014-09-02 4 views
0

Dire que j'ai texte comme ceci:Éclate une chaîne récursive

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

Le défi est de le diviser en mots, en utilisant des séparateurs de mots de la

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

.

Résultat souhaité:

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

Méthodes:

que je pouvais faire boucle sapply ou for en utilisant:

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

# etc.

Question:

Mais quelle est la solution utilisant Reduce(f, x, init, accummulate=TRUE)?

Répondre

4

Vous pouvez utiliser l'option perl = TRUE puis divisés sur la ponctuation ou l'espace

> 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

en effet très élégant! –

+0

Cela ne fournit pas la sortie désirée si ... –

+0

En fait je ne me dérange pas "je" + "d" vs "je ferais". Par souci de simplicité, je vais éditer la sortie désirée dans la question –

5

Vous ne devriez pas avoir besoin de Reduce ici. Vous devriez être en mesure de faire quelque chose comme ce qui suit:

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"   "'"    "'" 

Notez qu'un - dans une classe de caractères regex devrait venir en premier ou dernier, donc j'ai édité votre vecteur de « splitters » en conséquence. En outre, vous voudrez peut-être ajouter un + à la fin de votre "modèle" au cas où vous voulez réduire, disons, plusieurs espaces en un seul.

+0

@DavidArenburg, il est plus proche maintenant. – A5C1D2H2I1M1N2O1R2T1

+0

très utile au cas où il faut ajouter une personnalisation à l'autre réponse –

+0

une raison quelconque pour laquelle "tiret devrait venir en dernier"? –

2

je partirais avec (Il gardera "I'd" ensemble)

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