LoginSignup
0
0

More than 1 year has passed since last update.

【R】正規表現を使って文字列を取り出す

Last updated at Posted at 2022-03-02
library(tidyverse)
library(magrittr)
df1 <- data.frame(x1=c("a(12),b(30),c(0)", "b(6),c(9)"))

x1カラムからbの直後の()内の数字を取り出してみます。

df1 %<>% mutate(y1=str_extract(x1, "(?<=b\\()\\d+"))

"(?<=b\\()\\d+"は正規表現で、(?<=b\\()が肯定後読みでb(を探してその直後にアンカーを置きます。カッコは正規表現でグループ化を意味しますので、文字とて認識させるのにはバックスラッシュの後に書きます。(Rの正規表現では\\と2つ重ねる必要があります)
その後の\\d+は1文字以上連続している数字を取り出すことを意味します。
もう少し複雑な場合で、カッコの中に数字以外の文字を含む場合です。

df2 <- data.frame(x2=c("a(12),b(30A),c(0)", "b(6B),c(9)"))
df2 %<>% mutate(y2=str_extract(x2, "(?<=b\\().+?(?=\\))"))

少し複雑ですが、(?=\\()が肯定先読みです。
.+?は1文字以上の文字列で、肯定先読みで表される次の)の前までを読みます。
カッコの中は英数文字に限られる場合には、"(?<=b\\()\\w+)"とすることもできます。

df3 <- data.frame(x3=c("a(12),b1(30A),c(0)", "b12(6B),c(9)"))
df3 %<>% mutate(y3=str_extract(x3, "(?<=b.{0,2}?\\().+?(?=\\))"))

今度はbのあとにいくつかの文字が入っている場合です。
(?<=b.{0,2}?\\()でbの後の左カッコまでの0から2文字を読み飛ばしています。
Rで正規表現で後読みの中では、{}の中で文字数の範囲を指定する必要があります。
繰り返しを表す{0,2}+などの後の ?は最小量指定子です。

正規表現については、他の言語で分かりやすいサイトが多くありますので、そちらを参考にしてください。ただし、バックスラッシュを2つ連続して入れる必要があることと、後読みの中では繰り返し記号+*を使うことができないので、{0,2}のように範囲してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0