2017-06-03 9 views
2

greplを正規表現で使用するのは難しいです。私は文字ベクトル持っgreplと正規表現

text <- c(

    "D_Purpose__Repairs" , 
    "Age" , 
    "F_Job" 
) 

をそして私はD_またはF_で始まる単語を選択したい

はここで小さな例です。だから私は書く:

grepl("\\>D_.+ | \\>F_.+", text) 

grepl("\\D_.+ | \\F_.+", text) 

grepl("\\^D_.+ | \\^F_.+", text) 

は、しかし、これは返します

[1] FALSE FALSE FALSE 

を、あなたは私が私が間違っているのか理解に役立つ可能性があり、どのように私は自分のコードを修正する必要がありますか?

あなたのアドバイスは高く評価されます。

答えて

2

キャレット文字をバックスラッシュでエスケープする必要はありません(または避ける必要がありません)。また、|の前後に余分な空白を置くことはできません。あなたが意図したとおりこれは動作します:

> grepl("^D_.+|^F_.+", text) 
[1] TRUE FALSE TRUE 
2

あなたのパターンのいくつかのコメント:

  • \>D_.+ | \>F_.+ - ここでの実際の位置が単語の開始ありながら、ここで、\>は、単語位置の末尾にマッチ(そう、あなたが\<'). Also, the spaces aroundにしようとする場合があります|?are meaningful, you should not add them unless you use aのperl = TRUE with a(x) `は修飾子

  • \Fは未知の正規表現エスケープであるため、3210は不正なパターンです。 \Dは、数字以外の任意の文字に一致し、明らかに期待していないものです。

  • \^D_.+ | \^F_.+が最も近いが、冗長スペースが再度あり、エスケープされた^はリテラルキャレットシンボルと一致する。キャレットをエスケープしないと、文字列の開始位置に一致します。

さて、ここで最も効率的なパターンが

grepl("^[DF]_.+", text) 

意味です:

  • ^ - 文字列アンカーの開始
  • [DF] - のいずれかDF文字
  • _ - リテラルアンダースコア
  • .+ - 文字列の最後まで可能な限り1つ以上の任意の文字。