R Language
パターンマッチングと置換
サーチ…
前書き
このトピックでは、一致する文字列パターンの抽出と置き換えについて説明します。複雑なパターンの定義の詳細については、 正規表現を参照してください。
構文
grep( "query"、 "subject"、optional_args)
grepl( "query"、 "subject"、optional_args)
gsub( "(グループ1)(グループ2)"、 "\\グループ#"、 "件名")
備考
他の言語との違い
エスケープされた正規表現シンボル( \1
)は、 pattern
引数だけでなく、 sub
とgsub
replacement
も\\1
などの2回目にエスケープする必要があります。
デフォルトでは、すべてのコマンド(grep、sub、regexpr)のパターンはPerl Compatible Regular Expression(PCRE)ではないので、ルックアラウンドのようなものはサポートされていません。しかし、各関数はperl=TRUE
引数を受け入れてそれらを有効にします。詳細については、 Rの正規表現のトピックを参照してください。
専門パッケージ
- 文字列
- stringr
置換を行う
# 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用の修飾子はグローバル一致のg
はg
です。
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)
}))
}