web-dev-qa-db-fra.com

Extraire une chaîne de mots entre deux mots spécifiques dans R

J'ai la chaîne suivante: "PRODUCT colgate good but not goodOKAY"

Je veux extraire tous les mots entre PRODUCT et OKAY

15
gyaanseeker

Cela peut être fait avec sub:

s <- "PRODUCT colgate good but not goodOKAY"
sub(".*PRODUCT *(.*?) *OKAY.*", "\\1", s)

donnant:

[1] "colgate good but not good"

Aucun package n'est nécessaire.

Voici une visualisation de l'expression régulière:

.*PRODUCT *(.*?) *OKAY.*

Regular expression visualization

Démo Debuggex

28
G. Grothendieck

Vous pouvez utiliser gsub:

vec <- "PRODUCT colgate good but not goodOKAY"

gsub(".*PRODUCT\\s*|OKAY.*", "", vec)
# [1] "colgate good but not good"
16
Sven Hohenstein
x = "PRODUCT colgate good but not goodOKAY"
library(stringr)
str_extract(string = x, pattern = Perl("(?<=PRODUCT).*(?=OKAY)"))

(?<=PRODUCT) - regardez derrière le match pour PRODUCT

.* correspond à tout sauf aux nouvelles lignes.

(?=OKAY) - regardez en avant pour faire correspondre OKAY.

Je dois ajouter que vous n'avez pas besoin du package stingr pour cela, les fonctions de base sub et gsub fonctionnent bien. J'utilise stringr pour sa cohérence de syntaxe: que j'extrait, remplace, détecte, etc. les noms de fonction sont prévisibles et compréhensibles, et les arguments sont dans un ordre cohérent. J'utilise stringr car cela m'évite d'avoir besoin de la documentation à chaque fois.

16
Gregor

Vous pouvez utiliser le rm_between fonction du package qdapRegex. Il prend une chaîne et une frontière gauche et droite comme suit:

x <- "PRODUCT colgate good but not goodOKAY"

library(qdapRegex)
rm_between(x, "PRODUCT", "OKAY", extract=TRUE)

## [[1]]
## [1] "colgate good but not good"
10
Tyler Rinker