正規表現
Text Update: 12/12, 2018 (JST)

正規表現は文字列検索において非常に有用ですが分かりにくいところがあります。実際に正規表現を用いて処理がどのような結果になるかを見て見ましょう。

Packages and Datasets

本ページではR version 3.4.4 (2018-03-15)の標準パッケージ以外に以下の追加パッケージを用いています。
 

Package Version Description
tidyverse 1.2.1 Easily Install and Load the ‘Tidyverse’

 

はじめに

正規表現の処理を確認するにはgrep関数を用います。grep関数は任意のベクトル変数に対して指定したパターンが一致した場合、一致した位置を表すベクトルを返します。
 

c("abc", "def", "0ab", "0AB", "acb", "aac", "aca") %>% 
  grep("[ac]", .)
## [1] 1 3 5 6 7

 

正規表現を確認する

[]()の違い

[][]内で指定されている一文字のどれかが対象に存在すれば一致と見なされます。
 

c("abc", "def", "0ab", "0AB", "acb", "aac", "aca") %>% 
  grep("[ab]", .)
## [1] 1 3 5 6 7

 
一方、()()内で指定されている文字を一文字として見なして一致を判断します。
 

c("abc", "def", "0ab", "0AB", "acb", "aac", "aca") %>% 
  grep("(ab)", .)
## [1] 1 3

 

範囲指定

[]内で文字を-で結ぶとその範囲内にある一文字のどれかが、対象に存在すれば一致とみなされます。以下は"[abc]"と指定した場合と等価です。
 

c("abc", "def", "0ab", "0AB", "acb", "aac", "aca") %>% 
  grep("[a-c]", .)
## [1] 1 3 5 6 7
c("abc", "def", "0ab", "0AB", "acb", "aac", "aca") %>% 
  grep("[abc]", .)
## [1] 1 3 5 6 7

 

含まれない

^[]内に含まれる一文字とは異なる文字が対象に存在すれば一致とみなします。“0ab”は“abc”とは異なる文字(“0”)があるので一致と見なしています。
 

c("abc", "def", "0ab", "0AB", "acb", "aac", "aca") %>% 
  grep("[^a-c]", .)
## [1] 2 3 4

 

繰り返し

{}{}内で指定した回数だけ繰り返している文字が対象に存在すれば一致とみなします。以下は“aa”を検索してるのと等価です。
 

c("abc", "def", "0ab", "0AB", "acb", "aac", "aca") %>% 
  grep("[a]{2}", .)
## [1] 6
c("abc", "def", "0ab", "0AB", "acb", "aac", "aca") %>% 
  grep("(aa)", .)
## [1] 6

 

名前付き文字クラス

頻繁に使うような文字に対しては名前付き文字クラスが用意されています。例えば[:digit:]は数字(数値)を意味する名前付き文字クラスですので、数字(数値)が含まれている場合のみ一致とみなされます。
 

c("abc", "def", "0ab", "0AB", "acb", "aac", "aca", "PC-98") %>% 
  grep("[[:digit:]]", .)
## [1] 3 4 8

 
名前付き文字クラスもリテラルと同様にメタ文字を利用することができます。例えば数字が含まれている場合は以下のように。
 

c("abc", "def", "0ab", "0AB", "acb", "aac", "aca", "PC-98", "A-10") %>% 
  grep("[[:digit:]]+", .)
## [1] 3 4 8 9

 
アルファベット二文字と数字一文字以上が“-”でつながれている場合は以下のように。
 

c("abc", "def", "0ab", "0AB", "acb", "aac", "aca", "PC-98", "A-10") %>% 
  grep("([[:alnum:]]{2})-([[:digit:]]+)", .)
## [1] 8

 
このように正規表現を用いることで様々な指定が可能になります。
 

正規表現を知るには

正規表現では様々な表現が可能ですので、R で使える正規表現を知りたい場合は以下のコマンドを実行して確認してください。ただし、説明はすべて英語です。

?regex

 
Enjoy!  

本blogに対するアドバイス、ご指摘等は データ分析勉強会 または GitHub まで。

CC BY-NC-SA 4.0 , Sampo Suzuki