2017-07-28 86 views
2

我想搜索任何以55開頭的東西以及任何含有Roof(區分大小寫,適合那些好奇的人)的文字。是否可以在grepl()中使用AND運算符?

到目前爲止,我一直不成功,因爲我只能似乎使用OR操作:

grepl("*^55|*Roof", dataset$longname) 

最後,我要實現的是這樣的:

grepl("*^55&&*Roof", dataset$longname) 

grepl("*^55&*Roof", dataset$longname) 

(顯然,這些都不起作用 - 它們僅用於說明。)

我想我的結果表明任何與55並且具有在任何地方的話Roof開始。

例如,我希望這兩種結果由grepl()功能被拾起的:

55 - Roof Structure 

55-Wall to Roof 

是否有可以與grepl()使用的AND操作?

+0

你可能想看看[這個問題(https://開頭計算器。 com/questions/13187414/r-grep-is-there-an-and-operator) –

+0

[r-grepl找到多個字符串存在]的可能重複(https://stackoverflow.com/questions/44152970/r-grepl -to-find-multiple-strings-exists) – AkselA

回答

4

搜索具有兩個「A」和「B」

grepl("a", x) & grepl("b", x) 

grepl("a.*b|b.*a", x) 

如果我們知道這兩個部分的順序的一串那麼我們可以省略兩者之一最後的grepl的一半。例如,在討論中的查詢的情況下,這將足以發現,與55開始,包括屋頂

grepl("^55.*Roof", x) 
+0

完美!第二個選項對我來說最合適,因爲我希望儘可能保持我的代碼清潔和簡潔。我選擇了:'grepl(「*^55. * Roof」,數據集$ longname)'謝謝。 – MusTheDataGuy

+0

是否可以包含多個「AND」,或者是您的第一個示例所在的位置?例如,我可以做'grepl(「* 55. * Roof。* TOS」,數據集$ longname)'?我已經嘗試過,並沒有返回任何結果,所以我猜測不了。 – MusTheDataGuy

+0

如果您知道您可以使用'a。* b。* c'命令,但是如果您不能使用多個'grepl'命令'grepl(...)&grepl(...)&grepl(.. 。)'或者使用'a。* b。* c | a。* c。* b | b。* a。* c | b。* a。* c | c。* a。* b | c。* b。* a'。 –

2

我重新張貼由@Psidom一個答案,他已被刪除,但被擴展到字符串n AND子句。如果@Psidom undeletes他的回答,我會刪除這個(我投票取消刪除),但覺得答案是其它搜重要:

s <- c("55 - Roof Structure", "55-Wall to Roof", 'd 55 Roof') 
grepl("(?=.*^55)^Roof", s, perl = TRUE) 
## [1] TRUE TRUE FALSE 

## 2 AND clauses 
grepl("^(?=.*^55)(?=.*Roof)(?=.*Wall)", s, perl = TRUE) 
## [1] FALSE TRUE FALSE 
相關問題