web-dev-qa-db-ja.com

Rでgreplを使用した完全な単語照合

次の例を考えてみましょう。

> testLines <- c("I don't want to match this","This is what I want to match")
> grepl('is',testLines)
> [1] TRUE TRUE

しかし、私が欲しいのは、それが単一の単語として独立している場合にのみ「is」と一致することです。 Perlのドキュメントを少し読んだところ、これを行う方法は\ bを使用することであるように見えました。これは、パターンの前後にあるものを識別するために使用できるアンカーです。つまり、\ bword\bは「Word」と一致しますが「sword」とは一致しません。 '。そこで、「TRUE」に設定されたPerl構文を使用して、次の例を試しました。

> grepl('\bis\b',testLines,Perl=TRUE)
> [1] FALSE FALSE

私が探している出力はFALSE TRUE

22
Aaron

「\ <」はWor​​dの開始の別のエスケープシーケンスであり、「\>」は終了です。 R文字列では、円記号を2倍にする必要があるため、次のようになります。

> grepl("\\<is\\>", c("this", "who is it?", "is it?", "it is!", "iso"))
[1] FALSE  TRUE  TRUE  TRUE FALSE

これは「is!」と一致することに注意してください。しかし、「iso」ではありません。

30
Tommy

エスケープを正規表現に渡すには、ダブルエスケープが必要です。

> grepl("\\bis\\b",testLines)
[1] FALSE  TRUE
19
kohske

非常に単純に、先頭のスペースに一致します。

testLines <- c("I don't want to match this","This is what I want to match")
grepl(' is',testLines)
[1] FALSE  TRUE

正規表現にはこれ以上のものがありますが、基本的にパターンはより具体的である必要があります。より一般的なケースで必要になるのは、大きなトピックです。正規表現を参照してください

この例で機能するその他の可能性:

grepl(' is ',testLines)
[1] FALSE  TRUE
grepl('\\sis',testLines)
[1] FALSE  TRUE
grepl('\\sis\\s',testLines)
[1] FALSE  TRUE
6
mdsumner