library(tidyverse)ここまでの知識で、「小数」のみ抜き出すということが実現できます。
\dだけだと、
str_view("123.456", "\\d+")[1] │ <123>.<456>
小数点が数字でないので、うまく拾うことができません。
これをうまく拾うためには、
| | |
|:======:|:======:|:=======:| |123 |. | 456 | |\d+ |\. | \d+ | |数字の塊|ピリオド| 数字の塊|
という形で、 \d+\.\d+ という正規表現を用いてあげることが必要となります。
str_view(vec,"\\d+\\.\\d")Error in eval(expr, envir, enclos): object 'vec' not found
いかがでしょうか?
vecベクトルの中の、「小数」を塊としてキチンと拾えていますね?
ただ、これだと少数点がついていないケースはだめですね。
str_view(vec,"\\d+")Error in eval(expr, envir, enclos): object 'vec' not found
と
str_view(vec,"\\d+\\.\\d")Error in eval(expr, envir, enclos): object 'vec' not found
「小数を含む数字」を正規表現で表すにはどうすればよいでしょうか?
この場合は、いずれかを表す、「A|B」を使います。
test <- c("a","b","c","d")
str_view(test,"b")[2] │ <b>
str_view(test,"c")[3] │ <c>
str_view(test,"b|c")[2] │ <b>
[3] │ <c>
いかがでしょうか?「|」記号を使うことで「いずれか」という条件でひっかけることができています。
また、()でくくることでパターンの順番を考慮することも可能です。
test <- c("abb","abc","acb","acc")
str_view(test,"(b|c)(b|c)")[1] │ a<bb>
[2] │ a<bc>
[3] │ a<cb>
[4] │ a<cc>
とすることで、
- 一文字目にbかc、
- 二文字目にbかc
という指定ができて、bc、cb、bb、cc全部をひっかけることができました。
この()と|を利用して「小数を含む数字」をひっかけてみましょう。
str_view(vec,"\\d+\\.\\d+|\\d+")Error in eval(expr, envir, enclos): object 'vec' not found
\d+\.\d+ | \d+ 小数 あるいは 数字 という指定ですね。
注意!:ここで、数字 あるいは 小数 としてしますと、
str_view(vec,"\\d+|\\d+\\.\\d+")Error in eval(expr, envir, enclos): object 'vec' not found
このように、必ず小数のまえに数字が引っかかるので、小数が絶対に拾えなくなります。|を付けるときは、「複雑|単純」という順番にすることを留意しましょう。
正規表現が複雑になってくると、読みやすくするために、つい、
str_view(vec,"\\d+ \\. \\d+ | \\d+")Error in eval(expr, envir, enclos): object 'vec' not found
と、スペース等を入れたくなりますが、気をつけましょう。「 」スペースも文字なので、
str_view(vec," ")Error in eval(expr, envir, enclos): object 'vec' not found
数字の塊 スペース ピリオド スペース 数字の塊というような意味合いの正規表現になってしまいます。
その場合はある程度であれば()でくくってあげると
str_view(vec,"\\d+\\.\\d+|\\d+")Error in eval(expr, envir, enclos): object 'vec' not found
str_view(vec,"(\\d+\\.\\d+)|(\\d+)")Error in eval(expr, envir, enclos): object 'vec' not found
見やすくなります。
カッコは、囲むものに注意が必要です。
複雑な正規表現になってきた場合は、r”“での正規表現が見やすくするためには良いかもしれません。
str_view(vec, r"(\d+\.\d+|\d+)")Error in eval(expr, envir, enclos): object 'vec' not found
順番についてもう一言、
str_view(vec,"a(b|c)") #だと、ab と acが該当しますがError in eval(expr, envir, enclos): object 'vec' not found
str_view(vec,"(ab)|(c)") #だた、 ab か cが該当しますね?Error in eval(expr, envir, enclos): object 'vec' not found