114  実践3 小数の抜き出し

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>

とすることで、

という指定ができて、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