2017-09-17 5 views
0

J'essaie d'obtenir une expression qui prend un énorme quelques paragraphes et trouve des lignes avec deux mots spécifiques à la fois dans ces lignes, donc je cherche l'opérateur AND? De toute façon comment faire cela?R AND opérateur dans Regex

Par exemple:

c <- ("She sold seashells by the seashore, and she had a great time while doing so.") 

Je veux une expression qui trouve une ligne avec la ligne à la fois « vendu » et « grand ».

J'ai essayé quelque chose comme:

grep("sold", "great", c, value = TRUE) 

Toutes les idées?

Merci beaucoup!

Répondre

2

Vous pouvez créer deux groupes de capture, en supposant que l'ordre des mots est sans importance

grep("(sold|great)(?:.+)(sold|great)", c, value = TRUE) 
+0

Merci, mais je suis en train de chercher une ligne qui contient les deux, pas un mot. Si la ligne s'est vendue mais pas géniale, je ne veux pas que la ligne soit retournée. – intern14

+0

@ intern14, excuses, j'ai mal compris. Voir ma modification ci-dessus. –

0

Le double poste peut vous aider à démarrer, mais je ne pense pas que les adresses directement à votre question.

Vous pouvez combiner stringr::str_detect avec all

pos <- ("She sold seashells by the seashore, and she had a great time while doing so.") # contains sold and great 
neg <- ("She bought seashells by the seashore, and she had a great time while doing so.") # contains great 

pattern <- c("sold", "great") 

library(stringr) 
all(str_detect(pos,pattern)) 
# [1] TRUE 

all(str_detect(neg,pattern)) 
# [1] FALSE 

stringr::detect a l'avantage (sur grepl) de la recherche sur un vecteur de caractère de motifs

0

Alors que dans la plupart des cas, j'irais avec stringr paquet comme déjà suggéré dans la réponse de CPak, il y a aussi une solution de grep à ceci:

# create the sample string 
c <- ("She sold seashells by the seashore, and she had a great time while doing so.") 

# match any sold and great string within the text 
# ignore case so that Sold and Great are also matched 
grep("(sold.*great|great.*sold)", c, value = TRUE, ignore.case = TRUE) 

Hmm, pas mal, non? Mais que se passerait-il s'il y avait un mot contenant simplement l'expression sold ou great?

# set up alternative string 
d <- ("She saw soldier eating seashells by the seashore, and she had a great time while doing so.") 
# even soldier is matched here: 
grep("(sold.*great|great.*sold)", d, value = TRUE, ignore.case = TRUE) 

Vous pouvez utiliser des limites de mots, correspondent-à-dire le mot entier:

# \\b is a special character which matches word endings 
grep("(\\bsold\\b.*\\bgreat\\b|\\bgreat\\b.*\\bsold\\b)", d, value = TRUE, ignore.case = TRUE) 

le \\b matchs du premier caractère de la chaîne, le dernier caractère de la chaîne ou entre deux caractères où l'on Appartient à un mot et l'autre ne fonctionne pas:

Plus sur le \b métacaractère ici: