web-dev-qa-db-ja.com

grepl()でAND演算子を使用することは可能ですか?

_55_で始まるものと、単語Roof(大文字と小文字を区別する)が含まれているものを検索したいと思います。

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演算子はありますか?

9
Mus

「a」と「b」の両方を持つ文字列を検索するには

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

または

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

2つの部分の順序がわかっている場合は、最後のgreplの2つの半分のうちの1つを省略できます。たとえば、質問のクエリの場合、55で始まり、Roofを含む文字列を見つけるにはこれで十分です。

grepl("^55.*Roof", x)
13
G. Grothendieck

@Psidomは削除されましたが、n個のAND句に拡張可能であったため、回答を再投稿しています。 @Psidomが彼の応答を元に戻す場合、私はこれを削除します(私は元に戻すことに投票しました)が、他の検索者にとって答えが重要であると感じています:

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
3
Tyler Rinker