サーチ…


前書き

このトピックでは、一致する文字列パターンの抽出と置き換えについて説明します。複雑なパターンの定義の詳細については、 正規表現を参照してください。

構文

  • grep( "query"、 "subject"、optional_args)

  • grepl( "query"、 "subject"、optional_args)

  • gsub( "(グループ1)(グループ2)"、 "\\グループ#"、 "件名")

備考

他の言語との違い

エスケープされた正規表現シンボル( \1 )は、 pattern引数だけでなく、 subgsub replacement\\1などの2回目にエスケープする必要があります。

デフォルトでは、すべてのコマンド(grep、sub、regexpr)のパターンはPerl Compatible Regular Expression(PCRE)ではないので、ルックアラウンドのようなものはサポートされていません。しかし、各関数はperl=TRUE引数を受け入れてそれらを有効にします。詳細については、 Rの正規表現のトピックを参照してください。

専門パッケージ

置換を行う

# example data
test_sentences <- c("The quick brown fox quickly", "jumps over the lazy dog")

茶色のキツネ赤を作りましょう:

sub("brown","red", test_sentences)
#[1] "The quick red fox quickly"       "jumps over the lazy dog"

さあ、 "fast"キツネの行動を"fastly" "fast"作ろう。これではできません:

sub("quick", "fast", test_sentences)
#[1] "The fast red fox quickly"       "jumps over the lazy dog"

subは最初に利用可能な置換を行うだけです。 グローバル置換のためにgsubが必要です。

gsub("quick", "fast", test_sentences)
#[1] "The fast red fox fastly"       "jumps over the lazy dog"

他の例については、「置換による文字列の変更 」を参照してください。

マッチの検索

# example data
test_sentences <- c("The quick brown fox", "jumps over the lazy dog")   

マッチはありますか?

grepl()は、単語または正規表現が文字列または文字ベクトルに存在するかどうかをチェックするために使用されます。関数はTRUE / FALSE(または "Boolean")ベクトルを返します。

各文字列に「fox」という単語があるかどうかを確認し、その代わりにブールベクトルを受け取ることができます。

grepl("fox", test_sentences)
#[1]  TRUE FALSE

場所の一致

grepは文字列と正規表現を取ります。これは、インデックスの数値ベクトルを返します。これは、 "fox"という単語を含む文を返します。

grep("fox", test_sentences)
#[1] 1

一致する値

パターンに一致する文を選択するには:

# each of the following lines does the job:
test_sentences[grep("fox", test_sentences)]
test_sentences[grepl("fox", test_sentences)]
grep("fox", test_sentences, value = TRUE)
# [1] "The quick brown fox"

詳細

"fox"パターンは正規表現ではなく単なる単語なので、 fixed = TRUE指定することでパフォーマンスを向上させることができます( grepまたはgreplいずれか)。

grep("fox", test_sentences, fixed = TRUE)
#[1] 1

パターンと一致しない文を選択するにinvert = TRUE grepを使用します。または-grep(...)または!grepl(...)-grep(...) サブセット設定のルールに従います。

grepl(pattern, x)grep(pattern, x)両方で、 xパラメータはベクトル化されpatternパラメータはベクトル化されません。結果として、これらを直接使用してpattern[1]x[1]pattern[2]x[2]などと照合することはできません。

マッチの要約

greplコマンドなどを実行した後、 TRUEまたはFALSE一致数を概観することができFALSE 。これは、例えば大きなデータセットの場合に有用である。これを行うには、 summaryコマンドを実行します。

# example data
test_sentences <- c("The quick brown fox", "jumps over the lazy dog") 

# find matches
matches <- grepl("fox", test_sentences)

# overview
summary(matches)

シングルとグローバルマッチ。

正規表現を使って作業する場合、PCRE用の修飾子はグローバル一致のggです。

Rマッチングと置換関数には、最初のマッチとグローバルマッチという2つのバージョンがあります。

  • sub(pattern,replacement,text)は、patternの最初のオカレンスをテキストの置換で置き換えます

  • gsub(pattern,replacement,text)はsubと同じことを行いgsub(pattern,replacement,text)が、パターンの出現ごとに

  • regexpr(pattern,text)はpatternの最初のインスタンスの一致の位置を返します

  • gregexpr(pattern,text)はすべての一致を返します。

いくつかのランダムなデータ:

set.seed(123)
teststring <- paste0(sample(letters,20),collapse="")

# teststring
#[1] "htjuwakqxzpgrsbncvyo"

母音を何か別のものに置き換えたい場合に、これがどのように機能するか見てみましょう。

sub("[aeiouy]"," ** HERE WAS A VOWEL** ",teststring)
#[1] "htj ** HERE WAS A VOWEL** wakqxzpgrsbncvyo"

gsub("[aeiouy]"," ** HERE WAS A VOWEL** ",teststring)
#[1] "htj ** HERE WAS A VOWEL** w ** HERE WAS A VOWEL** kqxzpgrsbncv ** HERE WAS A VOWEL**  ** HERE WAS A VOWEL** "

さて、1つまたは複数の母音の直後に子音を見つける方法を見てみましょう。

regexpr("[^aeiou][aeiou]+",teststring)
#[1] 3
#attr(,"match.length")
#[1] 2
#attr(,"useBytes")
#[1] TRUE

私たちは、長さ2の文字列の位置3に一致します。すなわち、 ju

今すぐすべての試合を見たい場合:

gregexpr("[^aeiou][aeiou]+",teststring)
#[[1]]
#[1]  3  5 19
#attr(,"match.length")
#[1] 2 2 2
#attr(,"useBytes")
#[1] TRUE

これは本当に素晴らしいですが、これはマッチの位置を使用するだけで一致するものを得るのは簡単ではありません。ここではregmatchesというのはregmatchesからマッチした文字列を抽出することですが、構文が異なります。

マッチを変数に保存して元の文字列から抽出しましょう:

matches <- gregexpr("[^aeiou][aeiou]+",teststring)
regmatches(teststring,matches)
#[[1]]
#[1] "ju" "wa" "yo"

これはショートカットを持たないのが奇妙に聞こえるかもしれませんが、これは最初のものとのマッチによる別の文字列からの抽出を可能にします(2つの長いベクトルを比較することを考えてください。簡単な比較):

teststring2 <- "this is another string to match against"
regmatches(teststring2,matches)
#[[1]]
#[1] "is" " i" "ri"

注意:デフォルトでパターンはPerl互換正規表現ではありませんが、ルックアラウンドのようなものはサポートされていませんが、ここで提示されている各関数はperl=TRUE引数を許可しています。

大きなデータセットで一致を見つける

大きなデータセットの場合、 grepl("fox", test_sentences)の呼び出しはgrepl("fox", test_sentences)機能しません。大きなデータセットは、例えば、クロールされたウェブサイトまたは数百万のツイートなどです。

最初の加速は、 perl = TRUEオプションの使用です。より速くても、オプションfixed = TRUEです。完全な例は次のとおりです。

# example data
test_sentences <- c("The quick brown fox", "jumps over the lazy dog")

grepl("fox", test_sentences, perl = TRUE)
#[1]  TRUE FALSE

テキストマイニングの場合、しばしばコーパスが使用されます。コーパスはgrepl直接使用することはできません。したがって、この関数を考えてみましょう:

searchCorpus <- function(corpus, pattern) {
  return(tm_index(corpus, FUN = function(x) {
    grepl(pattern, x, ignore.case = TRUE, perl = TRUE)
  }))
} 


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow