R(正規表現)

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"

2024年1月17日 (水)

[R]ファイル名を示す文字列から拡張子を削除する

ファイル名を文字列型ベクトルに格納して、gsub関数で正規表現を使えば簡単に削除できる。以下、例。

> s <- c("abc", "abc.def", "abc.def.ghi")
> gsub("\\.[^\\.]+$", "", s)
[1] "abc" "abc" "abc.def"

「¥¥.」は「.」(ピリオド)一文字を表現している。「.」はパターンを表す書式に使用されるため、それを避けるために前に「¥」を付けている。この付けた「¥」自体もパターンを表す書式に使用する文字のため、「¥」の前にもさらに「¥」を付けている。

「[^¥¥.」+」とは、ピリオド以外の文字を一つ以上ということ。このように指定しないと、含まれるピリオドより右側すべての文字が削除されてしまう。

2023年12月 3日 (日)

[R]正規表現を使用して任意の長さの文字列を検索する

「.」と「{n}」を使う。パターンでは「.」は\n以外の任意の一文字を示す。「{n}」は直前の文字をn回繰り返す意味になる。なお、「{n,}」とするとn回以上という意味になる。

> s <- c("a", "ab", "abc", "abcd")
> grep("^.$", s)
[1] 1
> grep("^.$", s, value = TRUE)
[1] "a"
> grep("^..$", s, value = TRUE)
[1] "ab"
> grep("^.{2}$", s, value = TRUE)
[1] "ab"
> grep("^.{2,}$", s, value = TRUE)
[1] "ab" "abc" "abcd"
> s <- c("この葉", "木の葉", "樹木の葉")
> grep("の", s, value = TRUE)
[1] "この葉" "木の葉" "樹木の葉"
> grep("^.の", s, value = TRUE)
[1] "この葉" "木の葉"

2023年11月21日 (火)

[R]正規表現を使用して文字列を別の文字列に置換する

stringrパッケージのstr_replace_all関数を使う。元となる文字列にはベクトルを指定することができる。str_replaceという別の関数もあり、こちらは各文字列で最初にパターンにマッチした箇所しか置換をしない。

> library("stringr")
> s <- c("ABCD", "BCDE", "CDEF")
> str_replace_all(s, "B", "b")
[1] "AbCD" "bCDE" "CDEF"
> str_replace_all(s, "^B", "b")
[1] "ABCD" "bCDE" "CDEF"
> str_replace_all(s, "[E-F]$", "b")
[1] "ABCD" "BCDb" "CDEb"
> str_replace_all(s, "[E-F]", "b")
[1] "ABCD" "BCDb" "CDbb"
> str_replace(s, "[E-F]", "b")
[1] "ABCD" "BCDb" "CDbF"

ただ文字列を置換するのではなく、パターンに含まれる文字列を使用して置き換えたい場合は、キャプチャによるグループ化を利用する。パターン内で( )(括弧)に挟まれた範囲はグループ化(キャプチャという)される。このグループには、キャプチャされた順番に1から始まる連番が付けられ、置換後の文字列で\1, \2, …と挿入することで、置換後の文字列に挿入することができる(実際にはエスケープシーケンスを使用する必要があるので、\\1, \\2, …とする)。

以下は7桁の数字(○○○○○○○)を郵便番号の表記(○○○-○○○○)に置き換えた例。

> s <- c("1234567", "9876543", "3210")
> str_replace_all(s, "([0-9]{3})([0-9]{4})", "\\1-\\2")
[1] "123-4567" "987-6543" "3210"

2023年11月15日 (水)

[R]正規表現を使用して文字列を別の文字列に置換する

gsub関数を使う。元となる文字列にはベクトルを指定することができる。

> s <- c("ABCD", "BCDE", "CDEF")
> gsub("B", "b", s)
[1] "AbCD" "bCDE" "CDEF"
> gsub("^B", "b", s)
[1] "ABCD" "bCDE" "CDEF"
> gsub("[E-F]", "b", s)
[1] "ABCD" "BCDb" "CDbb"
> gsub("[E-F]$", "b", s)
[1] "ABCD" "BCDb" "CDEb"

ただ文字列を置換するのではなく、パターンに含まれる文字列を使用して置き換えたい場合は、キャプチャによるグループ化を利用する。パターン内で( )(括弧)に挟まれた範囲はグループ化(キャプチャという)される。このグループには、キャプチャされた順番に1から始まる連番が付けられ、置換後の文字列で\1, \2, …と挿入することで、置換後の文字列に挿入することができる(実際にはエスケープシーケンスを使用する必要があるので、\\1, \\2, …とする)。

以下は7桁の数字(○○○○○○○)を郵便番号の表記(○○○-○○○○)に置き換えた例。

> s <- c("1234567", "9876543", "3210")
> gsub("([0-9]{3})([0-9]{4})", "\\1-\\2", s)
[1] "123-4567" "987-6543" "3210"