R(正規表現)

2026年2月26日 (木)

[R]正規表現でIPv4によるIPアドレス表記の文字列かどうか判定する

正規表現パターンに「^([0-9]+\\.){3}[0-9]+$」を指定すればよい。あらかじめ文字列の先頭と末尾の空白は取り除いておくこと。

> s <- c("12.34.56.78", "123.456.789.123", "123.456", "a.b.c.d", "ab.cd.ef.gh")
> grep("^([0-9]+\\.){3}[0-9]+$", s, value = TRUE)
[1] "12.34.56.78" "123.456.789.123"

2025年12月23日 (火)

[R]文字列が指定の正規表現パターンとマッチするかどうか調べる

grep関数を使うと、指定の正規表現パターンにマッチするかどうか簡単に調べることができる。要素が複数のベクトルを対象とすることができ、マッチする要素がある場合はそのインデックスを返す。マッチする要素がない場合は長さが0の数値型ベクトルが返される。インデックスではなく要素自体を返すには、valueオプションにTRUEを指定する。

> s <- c("石見舞菜香", "鈴木みのり", "瀬戸麻沙美", "和多田美咲")
> grep("美", s)
[1] 3 4
> grep("美$", s)
[1] 3
> grep("希世乃", s)
integer(0)
> grep("美$", s, value = TRUE)
[1] "瀬戸麻沙美"
> grep("美[^$]", s, value = TRUE)
[1] "和多田美咲"

2025年12月 6日 (土)

[R]正規表現を使用して文字列型ベクトルから特定の文字列を含む要素を取り出す

grep関数を使う。検索する文字列の指定には正規表現が適用される。検索対象にベクトルを扱うことができ、デフォルトでは指定した正規表現のパターンに一致する要素のインデックスを返す。要素自体を返すようにするにはvalueオプションにTRUEを指定する。

> cv <- c("石見舞菜香さん", "上田麗奈さん", "鈴木みのりさん", "瀬戸麻沙美さん")
> cv <- append(cv, c("のぐちゆりさん", "優木かなさん", "和多田美咲さん"))
> grep("美", cv)
[1] 4 7
> grep("美", cv, value = TRUE)
[1] "瀬戸麻沙美さん" "和多田美咲さん"
> grep("美さん$", cv, value = TRUE)
[1] "瀬戸麻沙美さん"
> grep("[の木]", cv, value = TRUE)
[1] "鈴木みのりさん" "のぐちゆりさん" "優木かなさん"
> grep("(石見|優木)", cv, value = TRUE)
[1] "石見舞菜香さん" "優木かなさん"

一致する要素がない場合は、長さが0のベクトルを返す。

> grep("令", cv)
integer(0)
> grep("令", cv, value = TRUE)
character(0)

2025年11月 9日 (日)

[R]特定の文字列で始まる(始まらない)文字列を抽出する

正規表現で^記号は文字列の先頭を表すため、これを正規表現パターンに利用する。invertオプション(デフォルト:FALSE)をTRUEにすると、指定した正規表現パターンに一致しない要素を返す。

> ss <- c("石見舞菜香", "鈴木みのり", "瀬戸麻沙美", "のぐちゆり", "和多田美咲")
> # 「の」で始まる氏名
> grep("^の", ss, value = TRUE)
[1] "のぐちゆり"
> # 「の」で始まらない氏名
> grep("^の", ss, invert = TRUE, value = TRUE)
[1] "石見舞菜香" "鈴木みのり" "瀬戸麻沙美" "和多田美咲"
> # 「の」を含むが「の」で始まらない氏名
> grep("^.+の", ss, value = TRUE)
[1] "鈴木みのり"

ルックアラウンド式(lookaround expression)を使うこともできるが、perlオプション(デフォルト:FALSE)をTRUEにする必要がある。

> grep("^(?=の)", ss, value = TRUE)
grep("^(?=の)", ss, value = TRUE) でエラー:
不正な正則表現です、理由は 'Invalid regexp'
> # 「の」で始まる氏名 ※肯定的な先読み
> grep("^(?=の)", ss, perl = TRUE, value = TRUE)
[1] "のぐちゆり"
> # 「の」で始まらない氏名 ※否定的な先読み
> grep("^(?!の)", ss, perl = TRUE, value = TRUE)
[1] "石見舞菜香" "鈴木みのり" "瀬戸麻沙美" "和多田美咲"

ルックアラウンド式については、以下のページの「Lookaround の概要」を参照のこと。
https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-language-quick-reference#lookarounds-at-a-glance

2024年12月25日 (水)

[R]パターンにマッチするか否かを論理値で返す

stringrパッケージのstr_detect関数を使う。同じstringrパッケージのstr_which関数はパターンにマッチする要素のインデックスを返すが、str_detect関数はマッチする要素は真(TRUE)、マッチしない要素は偽(FALSE)を返す。機能としてはbaseパッケージのgrepl関数と同等。

> s <- c("石見舞菜香", "鈴木みのり", "瀬戸麻沙美", "和多田美咲")
> stringr::str_which(s, "美")
[1] 3 4
> stringr::str_which(s, "美$")
[1] 3
> stringr::str_detect(s, "美")
[1] FALSE FALSE TRUE TRUE
> stringr::str_detect(s, "美$")
[1] FALSE FALSE TRUE FALSE
> grepl("美$", s)
[1] FALSE FALSE TRUE FALSE

2024年12月24日 (火)

[R]パターンにマッチするか否かを論理値で返す

grepl関数を使う。grep関数はパターンにマッチする要素のインデックスを返すが、grepl関数はマッチする要素は真(TRUE)、マッチしない要素は偽(FALSE)を返す。

> s <- c("石見舞菜香", "鈴木みのり", "瀬戸麻沙美", "和多田美咲")
> grep("美", s)
[1] 3 4
> grep("美$", s)
[1] 3
> grepl("美", s)
[1] FALSE FALSE TRUE TRUE
> grepl("美$", s)
[1] FALSE FALSE TRUE FALSE

2024年12月14日 (土)

[R]正規表現を使用していずれかの文字列にマッチする文字列を抜き出す

|記号を使う。それぞれの文字列は( )(括弧)で囲む。

> name <- c("カナメ", "セナディア", "イレイナ")
> seiyu <- c("安野希世乃", "鈴木みのり", "本渡楓")
> grep("イ", name, value = TRUE)
[1] "イレイナ"
> grep("カ", name, value = TRUE)
[1] "カナメ"
> grep("(イ|カ)", name, value = TRUE)
[1] "カナメ" "イレイナ"
> grep("(カ|ナ)", name, value = TRUE)
[1] "カナメ" "セナディア" "イレイナ"
> grep("(カ|ナ$)", name, value = TRUE)
[1] "カナメ" "イレイナ"

2024年2月 4日 (日)

[R]正規表現を使用してファイル名を表す文字列から拡張子を抜き出す

1つ目の例では、最後の拡張子を1つだけ抜き出している。2つ目の例では、1つ以上の拡張子のすべてを抜き出している。

> s <- c("カナメ.バッカニア.txt", "フレイア.ヴィオン.txt")
> gsub("^.+\\.", "", s)
[1] "txt" "txt"
> gsub("^[^\\.]+\\.", "", s)
[1] "バッカニア.txt" "ヴィオン.txt"

2024年1月23日 (火)

[R]正規表現を使用してファイル名を表す文字列から拡張子を消す

gsub関数を使う。1つ目の例は拡張子をすべて削除、2つ目の例は拡張子を一つだけ削除した例。

> s <- c("カナメ.バッカニア.txt", "フレイア.ヴィオン.txt")
> print(s)
[1] "カナメ.バッカニア.txt" "フレイア.ヴィオン.txt"
> gsub("\\..+$", "", s)
[1] "カナメ" "フレイア"
> gsub("\\.[^\\.]+$", "", s)
[1] "カナメ.バッカニア" "フレイア.ヴィオン"

2024年1月22日 (月)

[R]文字列から正規表現にマッチする文字列を抜き出す

str_extract関数を使う。str_match関数はその抜き出した文字列を分解して配列にして返す。マッチする文字列が無い場合はNAを返す。

以下は、郵便番号を表していると思われる文字列から、郵便番号の箇所のみ抜き出した例。正規表現では、「3桁の数字」+「「-」か何も無し」+「4桁の数字」からなる文字列を郵便番号と仮定して、抜き出している。str_match関数はマッチした内容を分解して表形式にして返す。

> s <- c("123-4567", "〒123-4567", "1234567", "123@4567", " 123-4567 ")
> str_extract(s, "([0-9]{3})(-*)([0-9]{4})")
[1] "123-4567" "123-4567" "1234567" NA "123-4567"
> str_match(s, "([0-9]{3})(-*)([0-9]{4})")
[,1] [,2] [,3] [,4]
[1,] "123-4567" "123" "-" "4567"
[2,] "123-4567" "123" "-" "4567"
[3,] "1234567" "123" "" "4567"
[4,] NA NA NA NA
[5,] "123-4567" "123" "-" "4567"
無料ブログはココログ

■■

■■■