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}
のように範囲してください。