正規表現

複数の文字列の中にあるパターンが存在するとき、そのようなパターンを表すのに正規表現が用いられる。他のプログラミング言語と同様に、R においても、いくつかの文字列処理関数が正規表現に対応している。例えば、パターンマッチ関数 grepmatch、文字列置換関数 sub などの関数が正規表現に対応している。

正規表現の基本的な使い方

文字列そのものがパターンであるとき、その文字列をそのまま並べて、正規表現とする。例えば、複数の文字列からなるベクトルの中から、ATG を含む文字列を調べる場合は次のようにする。

x <- c("ATTAGCATGTCTA", "TACGTAGTGCCA", "CAGTATGCA", "CCGGCATTAG", "GGCATAGTCTC")
grep("ATG", x)
## [1] 1 3

あるパターンにおいて、特定位置にある文字が指定された文字のうちどれか一つである場合、[] を利用して表現することができる。例えば、複数の文字列を含むベクトルの中で GGAT または GGTT を含む文字列を調べる場合は次のようにする。

x <- c("TTAGGATGCA", "TACGTGCCA", "CAGTGCA", "CCGGGTTTAG", "GGGTCTC")
grep("GG[AT]T", x)
## [1] 1 4

次に、あるパターンの特定位置にある文字列が任意の文字を表したい場合は . を使用して表現する。

x <- c("TTAGGATGCA", "TACGTGCCA", "CAGTGCA", "CCGGGTTTAG", "GGGTCTC")
grep("G.T", x)
## [1] 1 4 5

次に、あるパターンの特定位置にある文字列が、指定された文字以外であるような場合は、^ を利用して表現する。例えば、A から始まり G で終わる 3 文字で、かつ 2 番目の文字は C 以外であるパターンは次のように表現できる。

x <- c("AGG", "ACG", "ATG", "AAG", "TGG")
grep("ACG", x)
## [1] 2

grep("A[^C]G", x)
## [1] 1 3 4

指定された文字列の組み合わせがいくつある場合は、それらの文字列を区切り文字 | で繋いで並べ、() でくくることによって表現する。

x <- c("TACTAAA", "ACTAGGA", "CCAATGT", "AAGAAC", "AATGAG")
grep("T(AA|AG|GA)", x)
## [1] 1 2 5

繰り返しは +{} などで表すことができる。例えば、任意の文字列のあとに A が 1 回以上現れる場合は、次のように表現する。

x <- c("TACTAAAA", "ACTAAAAAA", "CCCGTGCT", "AAGAAAAC", "AATAGAAAAAG")
grep(".A+", x)
## [1] 1 2 4 5

任意の文字のあとに A が 5 回現れる場合は、次のように表現する。

x <- c("TACTAAAA", "ACTAAAAAA", "CCCGTGCT", "AAGAAAAC", "AATAGAAAAAG")
grep(".A{5}", x)
## [1] 2 5

任意の文字のあとに A が 4 回以上 5 回以下現れる場合は、次のように表現する。

x <- c("TACTAAAA", "ACTAAAAAA", "CCCGTGCT", "AAGAAAAC", "AATAGAAAAAG")
grep(".A{4,5}", x)
## [1] 1 2 4 5

ある文字列が複数回現れるような表現もできる。たとえば GC が 2 回以上現れる場合は次のように表現する。

x <- c("TAGCTAAAA", "ACTGCGCAAA", "CCCGTGCT", "AAGCGCGCGCAC", "AATAGCGCAAAAAG")
grep("(CG){2,}" ,x)
## 4

grep("(CG|GC){2,}" ,x)
## 2 4 5

後方参照

R で後方参照を行うため方法が用意されていない。しかし、正規表現のマッチング結果を少し編集することで、後方参照のような機能を実現させることができる。

x <- c("CATTCGTAC", "GGCGAT", "TCGTATTGCATCAG", "ACCGTA")

m <- regexpr("A.T", x)

back_ref <- substr(x, m, m + attr(m, "match.length") - 1)

back_ref
## [1] "ATT" ""    "ATT" ""

メタ文字

上で紹介した .[+ などはメタ文字と呼ばれている。R で利用できるメタ文字には次のようなものがある。

( )複数の文字を一つのパターンとしてまとめる。
[ ]クラスです。[ ] に囲まれた文字列のうちいずれかの1文字を表す。
$後尾
^先頭。ただし、[ ] の中で使うと、「それ以外」を表す。
?直前のパターンが、0 回または 1 回だけ繰り返すことを表す。
*直前のパターンが、0 回以上に繰り返すことを表す。
+直前のパターンが、1 回以上に繰り返すことを表す。
{2,5}前出パターンが、2 回以上 5 回以下に繰り返すことを表す。
.任意の一文字を表します。
|「または」を表します。
\メタ文字をエスケープする際に用いる。