2016-07-13 14 views
5

grepを使用して、文字列内の任意の場所で任意の順序で複数のパターンを一致させる最短の方法は何ですか?好ましくは、1つの短い線で塩基Rを使用する。文字列内の任意の場所で任意の順序で複数のパターンを一致させる

は、ここに例を示します

私が含まれているすべての要素を見つけたい一緒my_vectorの要素で任意の場所任意の順序の私matchesベクトルでこの2つの要素の全て、、、要素の中にそれらの間にある任意の文字を使用します。

grep(paste0("(?=.*", paste0(matches, sep = ""), ")", collapse = ""), 
    my_vector, 
    perl = TRUE) 

[1] 5 6 7 

をしかし、もっと簡潔な方法があります:

matches <- c("fe", "ve") 

#    1 2 3  4  5  6  7  8  9 
my_vector <- c("fv", "v", "f", "f_v_e", "fe_ve", "feve", "vefe", "fve" , "a") 

# want 5, 6, 7 

私はこれを行うことができますか?私の例では、一致する要素が2つありますが、実際の問題にはいくつかの問題があります。

+0

@ user2100721 - 8インチではどこですか? – thelatemail

+1

@ user2100721 - *この2つの要素の** all **を含むすべての要素を検索したい* – thelatemail

+1

@thelatemail:Ooh ...申し訳ありません。私は逃しました。ありがとう。 – user2100721

答えて

4

@Jotaがあった場合grepintersect

Reduce(intersect, lapply(matches, grep, my_vector)) 

を使用することができます述べたようにregex/paste

which(grepl(matches[1], my_vector) & grepl(matches[2],my_vector)) 
#[1] 5 6 7 

それはよりダイナミックにするために

which(Reduce(`&`, lapply(matches, grepl, my_vector))) 
#[1] 5 6 7 

それともだろう回避するためのオプションmatchesの多くの要素、pasteメソッドが機能しない可能性があります...

+1

素晴らしいです、ありがとう!これは、より少ないタイプの入力 – Ben

+5

も同様です: 'Reduce(交差、lapply(マッチ、grep、my_vector))' – Jota

+1

パイプで使うには: 'my_df%>% filter('& '、lapply(matches、grepl、my_column ))) 'と'の前後にバッククォートをつけて(そのコメントをどうやって取得するのかはわかりません!) – Ben

関連する問題