2017-09-17 11 views
0

Ich versuche, einen Ausdruck zu erhalten, der eine große Anzahl von Absätzen nimmt und Zeilen mit zwei bestimmten Wörtern in diesen Zeilen findet, also suche ich nach dem AND-Operator? Wie kann man das machen?R AND Operator in Regex

Zum Beispiel:

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

Ich möchte einen Ausdruck, der eine Linie mit den beiden „verkauft“ und „groß“ in der Zeile findet.

Ich habe so etwas wie versucht:

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

Irgendwelche Ideen?

Vielen Dank!

Antwort

2

Sie können zwei Capture-Gruppen erstellen, ist die Reihenfolge der Wörter unter der Annahme

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

Danke, aber ich suche eigentlich nach einer Zeile, die beides enthält, kein Wort. Wenn die Leitung verkauft wurde, aber nicht großartig, möchte ich nicht, dass die Leitung zurückgegeben wird. – intern14

+0

@ intern14, Entschuldigung, ich missverstanden. Siehe meine Bearbeitung oben. –

0

Das Duplikat Post könnte Sie beginnen, aber ich glaube nicht, Adressen Ihre Frage direkt.

Sie stringr::str_detect mit 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 den Vorteil kombinieren könnten (über grepl) von der Suche über einen Charakter Vektor von Mustern haben

0

Während in den meisten Fällen ich mit stringr Paket gehen würde, wie bereits in CPaks Antwort vorgeschlagen, gibt es auch ich grep Lösung zu diesem:

Hmm, nicht schlecht, oder? Aber was wäre, wenn es ein Wort gäbe, das nur den Ausdruck sold oder great enthält?

# 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) 

So möchten Sie vielleicht Wortgrenzen verwenden, dh das gesamte Wort übereinstimmen:

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

die \\b Matches erste Zeichen in der Zeichenfolge, letzte Zeichen im String oder zwischen zwei Zeichen, wo man angehört auf ein Wort und der andere nicht:

mehr auf dem \b metacharacter hier: