Muni Bus

パソコンの操作方法や設定方法を忘れないようにメモしています。ブログを一回引っ越ししているので、所々表示がかなり乱れています・・・

【R】正規表現のパターンに一致した文字列のみを取り出す

regmatches関数とregexpr関数を組み合わせることで、正規表現のパターンに一致したその文字のみを取り出すことができる。

以下は、文字型ベクトルからパターンに一致した文字のみをとりだした例。パターン「^1\\.[1-2]」の解釈は、「先頭文字が「1」で次の文字が「.」(ピリオド)でその次の文字が「1」か「2」」である(\\と\を2個並べていることに注意)。よって該当する文字は「1.1」と「1.2」のみであり、ベクトルの1つ目と2つ目の要素が該当し、そのパターンに一致した「1.1」と「1.2」が返されている。

> st <- c("1.1.1", "1.2.1", "1.3.1")
> regmatches(st, regexpr("^1\\.[1-2]", st))
[1] "1.1" "1.2"

これを利用すると、例えばApacheのログファイルから、アクセス元のIPアドレスのみを簡単に抜き出すことができる。Apacheのログは、通常は以下のような書式である。

XX.XX.XX.XX - - [XX/XXX/XXXX:XX:XX:XX +0900] "GET ~"
XX.XX.XX.XX - - [XX/XXX/XXXX:XX:XX:XX +0900] "GET ~"
・・・

この各行が1行ごとにベクトルvに代入されている場合は、以下のようにすれば、先頭のIPアドレスのみを文字ベクトルとして抜き出すことができる。

> regmatches(v, regexpr("^[0-9]{1,3}(\\.[0-9]{1,3}){3}", v))
[1] "XX.XX.XX.XXX" "XXX.XXX.X.XX" "X.XXX.XX.X"
・・・