2017-12-11 6 views
0

Rの正規表現にはかなり新しく、いくつかのパターンを含む文字列のベクトルと一致させようとしています。私はstackoverflowで検索し、それは類似の質問は尋ねられていないようだ。ここに一致する文字列mystringのベクトルがあります。このmystringPCREを使用したRの正規表現での複数の一致と複数除外

mystring <- c("fhwjantdesd", "unwanted", "fdedsifrfed", "undesired", "sdsyessd", "yedsfd") 

私はmystringは、文字列を除いた「望んでいた」「指名手配」の6文字の任意の順列が含まれるかどうかを把握したいです。同様に、文字列 "desired"と "yes"を除いて、 "desired"の7文字と "yes"の3文字の順列を含みます。

のでgrepl(pattern, mystring, perl = TRUE)の予想される出力は次のようになります。

[1] TRUE, FALSE, TRUE, FALSE, FALSE, TRUE 

私は機能をスピードアップすることができgreplのperlオプションを使用します。誰もがこのpatternにいくつかの手掛かりを提供できますか?パターンの各部分は、私がPCREを使用する上での出発点に過ぎないため、何を説明することができますか?あなたは、コード以下は、この

mystring <- c("fhwjantdesd", "unwanted", "fdedsifrfed", "undesired", "sdsyessd", "yedsfd") 
Status <- NULL 
str <- c("wanted", "desired", "yes") 
index <- 1 


for (i in mystring) { 
    for (j in str) { 
    char_length <- nchar(j) 

    if (is.na(str_extract(string = i, pattern = j)) | str_extract(string = i, pattern = j) == F) { 
     if (sum(unlist(strsplit(j, "")) %in% unlist(strsplit(i, ""))) >= char_length) { 
     Status[index] <- T 
     break 
     } 
    } 
    } 

    if (is.na(Status[index])) { 
    Status[index] = F 
    } 

    index <- index + 1 
} 

Status 

    > Status 
[1] TRUE FALSE TRUE FALSE FALSE TRUE 
+0

Re *私はgreplの 'perl'オプションを使いたいと思います。これは関数の速度を上げる可能性があります*"、それは遅くなる可能性もあります。 – ikegami

+0

これで問題は解決しますか? –

+0

@Hardikguptaあなたの答えはHardikに感謝します。それは私の問題を解決することができます。しかし、私はperlオプション付きの 'grepl()'答えがあるのだろうかと思っています。誰かがそのような答えを与えることができるのを待ってみましょう。 –

答えて

1

のように試すことができますおかげ

+0

お返事ありがとう@PIG。上記のコードの制限について少し説明できますか? –

+0

1)文字列 'abc'にマッチしてはいけません。 2)それは、それがすることをやることはむしろ非効率的なアプローチです。 'map {!/ yes | wanted | desired /} @ mystring'と同等のRがはるかに理にかなっています。 – ikegami

0

は、いくつかの制限で動作します。

grepl("(^((?!yes|wanted|desired).)*$)", mystring, perl=TRUE) 

上記の単語のみが除外されます。それはあなたのデータによるものです。

関連する問題