特定の条件にマッチするかどうかを判定する関数には、str_detect()
と grepl()
を使うことができる。
str_detect()
は stringr
パッケージの関数で、grepl()
はRの標準パッケージ(base)。
どちらとも正規表現が使える。
シンプルな検出なら grepl()
でもよいけれど、str_detect()
の方が汎用性が広いので、こちらをよく使っている。
また、str_detect
には、始まりと終わりだけ手軽にマッチできる str_starts()
, str_ends()
等もあるけど、個人的には、正規表現を覚えてすべて正規表現でコードした方が良いと思う。
str_detect()
str_detect()
は、stringerパッケージに含まれている関数なので、まずはパッケージを読み込む。
install.packages("stringr")
library(stringr)
str_detect(string, pattern, negate = FALSE)
- 引数
string
: 文字列または文字ベクトル(チェックしたい文字列)pattern
: 正規表現または単純な文字列(検索する文字またはパターン)negate
:TRUE
にすると、パターンが見つからない要素がTRUE
になる(デフォルトはFALSE
)。
- 戻り値
string
が単一の文字列の場合は、TRUE
またはFALSE
が返される(パターンが見つかればTRUE
)。string
がベクトルの場合は、各要素ごとに**TRUE
またはFALSE
のベクトル**が返される。
str_detect()の使用例
単純な文字の検出
str_detect("banana", "a")
output
[1] TRUE
- "banana" に "a" が含まれているので、
TRUE
が返される。
ベクトルに対する検出
str_detect(c("apple", "banana", "cherry"), "a")
output
[1] TRUE TRUE FALSE
- "apple" に "a" がある →
TRUE
- "banana" に "a" がある →
TRUE
- "cherry" に "a" はない →
FALSE
正規表現の利用
str_detect("banana123", "\\d")
output
[1] TRUE
\\d
は正規表現で数字 (0-9) を表すため、"banana123" に数字が含まれているためTRUE
が返される。
negate = TRUE
の使用
str_detect(c("apple", "banana", "cherry"), "a", negate = TRUE)
output
[1] FALSE FALSE TRUE
- "apple" に "a" がある →
FALSE
(含まれているのでFALSE
) - "banana" に "a" がある →
FALSE
(含まれているのでFALSE
) - "cherry" に "a" がない →
TRUE
(含まれていないのでTRUE
)
grepl()
grepl()
は、Rの標準パッケージ(base)に含まれている関数なので、追加のパッケージを読み込む必要はない。
grepl(pattern, x)
- 引数
pattern
: 正規表現または単純な文字列(検索する文字またはパターン)x
: 文字列または文字ベクトル(チェックしたい文字列)
- 戻り値
x
が単一の文字列の場合は、TRUE
またはFALSE
が返される(パターンが見つかればTRUE
)。x
がベクトルの場合は、各要素ごとに**TRUE
またはFALSE
のベクトル**が返される。
grepl() の使用例
単純な文字の検出
grepl("a", "banana")
output
[1] TRUE
- "banana" に "a" が含まれているので、
TRUE
が返される。
ベクトルに対する検出
grepl("a", c("apple", "banana", "cherry"))
output
[1] TRUE TRUE FALSE
- "apple" に "a" がある →
TRUE
- "banana" に "a" がある →
TRUE
- "cherry" に "a" はない →
FALSE
正規表現の利用
grepl("\\d", "banana123")
output
[1] TRUE
\\d
は正規表現で数字 (0-9) を表すため、"banana123" に数字が含まれているためTRUE
が返される。
str_detect() と grepl() の違い
以下に、str_detect()
と grepl()
の違いをまとめた表を示す。
機能 | str_detect() | grepl() |
---|---|---|
所属パッケージ | stringr パッケージ |
ベースR関数 |
引数の順番 | string, pattern |
pattern, x (逆順) |
ベクトル処理 | ベクトルに自動対応 | ベクトルに自動対応 |
ネゲート機能 | negate = TRUE でネゲートが可能 |
直接のネゲート機能はないが、 !grepl() で代用可能 |
機能の範囲 | 正規表現に対応、stringr の便利機能を活用 |
正規表現に対応 |
返り値 | TRUE/FALSE のベクトル |
TRUE/FALSE のベクトル |
どちらを使うべきか?
基本は str_detect()
を使うと考えておけばよい……が、シンプルなコードのときには grepl()
でも良い……といったイメージ。
状況 | 推奨する関数 | 理由 |
---|---|---|
1つの文字列を確認する | grepl() |
stringr を読み込む必要がないから |
ベクトルを処理する | str_detect() |
ベクトル化されているので便利 |
正規表現を使う | どちらでもOK | どちらも正規表現に対応している |
ベクトルの中でパターンが存在しない要素を確認したい | str_detect(strings, "a", negate = TRUE) |
negate = TRUE を使えるため |
正規表現を使った検出
正規表現を使った検出の例をいくつかまとめておく。
正規表現の種類etc.については、下記参照。
Rでよく使う正規表現のパターンを、カテゴリー別に整理してみた。 Rで使用する正規表現いろいろ 文字の検索・位置指定に関するパターン パターン 説明 例 ^ 文字列の先頭を指定 ^Hello は "Hello World" …
str_detect()
、 grepl()
のどちらも使えるけど、ここでは str_detect()
を使ってまとめる。
正規表現を使った例(基本)
特定の文字を含むかどうかの判定
str_detect("banana", "a")
output
[1] TRUE
- "banana" に "a" が含まれているため、
TRUE
が返される。
特定の文字が1回以上連続して出現するかどうか
str_detect("banana", "a+")
output
[1] TRUE
- "banana" に "a" が複数回出現しているため、
TRUE
が返される。
特定の文字が0回以上連続して出現するかどうか
str_detect("banana", "a*")
output
[1] TRUE
- "banana" には "a" が0回以上連続している部分があるため、
TRUE
が返される。
複数の文字のどれか1つにマッチ
str_detect("banana", "[aeiou]")
output
[1] TRUE
- "banana" には "a" が含まれているため、
TRUE
が返される。
特定の文字列が先頭にあるかどうか
str_detect("banana", "^b")
output
[1] TRUE
- "banana" は "b" で始まるので、
TRUE
が返される。
特定の文字列が末尾にあるかどうか
str_detect("banana", "a$")
output
[1] TRUE
- "banana" は "a" で終わるので、
TRUE
が返される。
特定の文字列が含まれていないかどうか
str_detect("banana", "[0-9]")
output
[1] FALSE
- "banana" には数字が含まれていないため、
FALSE
が返される。
ちょっと高度な使用例
複数の候補に一致するかどうか
str_detect("apple", "apple|banana|cherry")
output
[1] TRUE
- "apple" に "apple" が含まれているため、
TRUE
が返される。
大文字小文字の区別をしない判定
str_detect("Apple", "(?i)apple")
output
[1] TRUE
- "Apple" に "apple" が含まれているため、
TRUE
が返される。
数字が含まれているかどうか
str_detect("order123", "\\d")
output
[1] TRUE
- "order123" に "123" が含まれているため、
TRUE
が返される。
連続する数字が含まれているかどうか
str_detect("order123", "\\d+")
output
[1] TRUE
- "order123" に "123" という連続した数字が含まれているため、
TRUE
が返される。
特定の文字が繰り返し出現するかどうか
str_detect("banana", "(na){2}")
output
[1] TRUE
- "banana" に "na" が2回連続している部分があるため、
TRUE
が返される。
複数の空白文字を検出
str_detect("Hello World", "\\s+")
output
[1] TRUE
- "Hello World" には2つのスペースが含まれているため、
TRUE
が返される。
文字列の否定判定
含まれていないパターンを検出
str_detect("banana", "a", negate = TRUE)
output
[1] FALSE
- "banana" には "a" が含まれているため、
FALSE
が返される。
含まれていないパターンを検出(正規表現)
str_detect("banana", "[0-9]", negate = TRUE)
output
[1] TRUE
- "banana" には数字が含まれていないため、
TRUE
が返される。
ちょっと便利な実践例
便利な使い方色々。
ルアドレスの検出
str_detect("example@mail.com", "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}")
output
TRUE (有効なメールアドレス)
の検出 (yyyy/mm/dd)
str_detect("2024/12/15", "\\d{4}/\\d{2}/\\d{2}")
output
TRUE (日付形式に一致)
番号の検出 (XXX-XXXX-XXXX)
str_detect("090-1234-5678", "\\d{3}-\\d{4}-\\d{4}")
output
TRUE (電話番号に一致)