2016-02-05 1 views
0

Je voudrais faire correspondre le mot après un - dans mon texte, puis si ce mot correspond à la fin d'un autre mot, alors je voudrais faire une division entre le mot et le mot correspondant.Comment faire correspondre un mot après un certain caractère sans connaître le mot dans R?

Exemple du texte:

JOHN LION - XYZ RAN RUN TREEABC GRASS - ABC LIMB RAN RUN LION -XYZ JOG SUN 
SKY - ABC LION JOHN PONDABC RUN - PDF STONE 

ce que je voudrais que le texte à ressembler à:

JOHN LION - XYZ RAN RUN TREE ABC GRASS - ABC LIMB RAN RUN LION -XYZ JOG SUN 
SKY - ABC LION JOHN POND ABC RUN - PDF STONE 

Je ne veux pas de ne pas faire un grepl et un gsub sur ABC parce que le mot après le tableau de bord est toujours en train de changer et apparaîtra plusieurs fois. Le mot qui se trouve devant le mot correspondant sera également toujours différent et ne sera pas toujours TREE. Peu importe ce que le mot est en face du mot correspondant, je veux toujours faire une scission.

Si je fais la str_extract suivante:

str_extract(df, "(?<=-\\s)\\w+") 

Je ne correspondent XYZABC.

Je veux juste faire correspondre le mot après le - s'il est également à la fin d'un autre mot, mais encore une fois je ne sais pas ce que cet autre mot sera.

Je suis coincé comme quoi faire. S'il vous plaît laissez-moi savoir si d'autres informations sont nécessaires. Toute aide est la bienvenue.

+0

Je vois toutes sortes de problèmes avec cela, comme ce qui se passe si le tableau de bord après correspondance mot apparaît plus d'une fois? Y a-t-il des cas où vous ne voudriez pas séparer un mot apparié? –

+0

@Tim merci pour votre commentaire J'ai édité ma question. Mais le mot apparié post-dash apparaît plusieurs fois, et je veux toujours faire une scission quel que soit le mot devant le mot apparié. – Dre

Répondre

1

Voici une manière légèrement hacky. Appelons les données s:

s <- 'JOHN LION - XYZ RAN RUN TREEABC GRASS - ABC LIMB RAN RUN LION -XYZ JOG SUN SKY - ABC LION JOHN PONDABC RUN - PDF STONE' 

Avec stringr, nous allons utiliser votre regex existant pour extraire les motifs à matched:

library(stringr) 
pat <- str_extract_all(s, "(?<=-\\s)\\w+") 

Utilisez ces modèles pour trouver tous les mots avec les caractères non-blancs avant le modèle et un espace après (les mots qui ont besoin d'espaces):

words <- str_extract_all(s, paste0('[A-Za-z0-9]+', pat[[1]], '\\s')) 

Insérer des espaces dans ces mots en remplaçant les motifs d'esprit h un espace puis le motif. Pour le faire tout à la fois, vous devez utiliser lapply, comme str_extract_all produit une liste.

words2 <- lapply(1:length(words), function(x){   # a little hacky 
    str_replace_all(words[[x]], pat[[1]][x], paste0(' ', pat[[1]][x])) 
}) 

Pour remplacer tous les mots qui correspondent avec les fixes, nous devons exécuter str_replace_all avec chaque mot et le remplacement, donc nous avons besoin soit de mettre à jour s pendant que nous boucle avec sapply:

sapply(1:length(words), function(x){        # hacky 
    s <<- str_replace_all(s, unlist(words)[x], unlist(words2)[x]) # hackier 
}) 

qui produira une certaine sortie inutile, mais de mettre à jour s, ou utiliser une boucle for, ce qui est un peu plus propre:

for(x in 1:length(words)){ 
    s <- str_replace_all(s, unlist(words)[x], unlist(words2)[x]) 
} 

De toute façon, nous obtenons

> s 
[1] "JOHN LION - XYZ RAN RUN TREE ABC GRASS - ABC LIMB RAN RUN LION -XYZ JOG SUN SKY - ABC LION JOHN POND ABC RUN - PDF STONE" 
+0

Cela a fonctionné parfaitement. J'ai décidé d'aller avec la boucle for. Merci beaucoup. – Dre