081-085 正規表現
正規表現
- さあ、filterへ!といきたいところでえすが、もう一山、Booleanが「しるし」になることを理解したあと、文字列に「しるし」をつける方法を学びましょう。
- 正規表現というものですが、これは、多分、このコースでもかなりとっつきにくい部類に入ります。
- たとえば、次の文字列から、数字だけを抜き出したい場合にどのような方法がとれるでしょう?
vec <- c("HbA1c:9.2%","ALT:120UI","WBC:9.3x10^3")
- いままでにお伝えしたものでは無理です。
- ここから、このような、文字配列的に汚いデータから欲しいデータを抜き出す方法、正規表現を学びましょう。
#ちなみに、上記の問題は、 library(stringr) str_extract(vec, "(?<=:)(\\d+\\.\\d+)|(?<=:)\\d+")
- で達成できます。
正規表現とは
正規表現は文字列をパターンでひっかける手法です。
注:
vec <- c("1","120","34.3","ab123", "5b","6 5","7","b","ac4235432", "45.3mg/dl","abc500ml 3unit 3:40AM", "^ is start.", "this sign($) represents end.", "....") vec
- たとえば、"1"という文字が含まれているかどうかを調べたければ、
str_detect()
を使います。
str_detect(vec,"1") #[]をつかって抜き出してみましょう。 vec[str_detect(vec,"1")] #尚、複数の文字列をひっかけたい場合は、"[1234]"のように書きます。 check <- str_detect(vec,"[1234]") vec[check]
正規表現を色々確認してみる
- 何が引っ掛かったかみたい場合は、str_view()を使うとわかりやすいです。
str_view(vec,"[1234]") str_view(vec,"[1234567890]") str_view(vec,"[0-9]") #二文字引っ掛かったかは、 str_view(vec,"[0-9][0-9]") str_view(vec,"[0-9]{1,}") #数字が連続した場合を調べるには str_view(vec,"[0-9]+") #x回数以上y回数以下を調べるには str_view(vec,"[0-9]{3,4}") #[0-9] と \\dは同じ意味です。 str_view(vec,"\\d+") #「なんでもよい」場合は.で表現できます。 str_view(vec,".") str_view(vec,".+") #パターンの開始が文字列の先頭にあるかを^で調べることもきます。 str_view(vec,"^b") #同様に最後は$です。 str_view(vec,"\\d{3}$") #^と$ str_view(vec,"^b$") str_view(vec,"^\\d+$") #ところで、.とか^とか$とかを str_view(vec,"^") #ひっかけるにはどうしたらいいでしょうか?\\でエスケープ str_view(vec,"\\^") str_view(vec,"\\$") str_view(vec,"\\.+")
正規表現で小数点がある数字だけ抜き出してみる
- ここまでの知識で、最初の少数点のみ抜き出すということが実現できます。
- 143.23 は、
\\d+\\.\\d+
で拾えるので、
str_view(vec,"\\d+\\.\\d")
- でも、これだと少数点がついていないケースはだめですね
\\d+
のみのパターンに対しては|
をつかいます。\\d+\\.\\d+ | \\d+
str_view(vec,"\\d+\\.\\d+ | \\d+") #これだとうまくいきません
- 「 」スペースも文字なので、
str_view(vec," ") str_view(vec,"\\d+\\.\\d+|\\d+") str_view(vec,"(\\d+\\.\\d+)|(\\d+)") str_view(vec,"a(b|c)") str_view(vec,"(ab)|(c)")
正規表現の練習
- 次のような文字列から、欲しい数字を抜き出すにはどうしますか?
exa <-"room200 3unit AM3:40 abc300ml"
- "abc300ml"が何らかの点滴の名前だとして、300mlの300を抜き出したいとすると、
str_view(exa,"\\d+") #X
- 条件をつけます!
- パターンA(?=パターンB)で、「パターンAパターンB」がひっかかる部分のパターンAを抜き出す。という操作ができます
str_view(exa,"\\d+(?=ml)")
- (?<=パターンA)パターンBだと<の開いている方向に
- (?=)と同様のことができます。
str_view(exa,"(?<=room)\\d+") str_view(exa,"(?<=abc)\\d+") str_view(exa,"\\d+(?=ml)") str_view(exa,"\\d+(?=unit)") #その他 str_view(vec,"\\w+") #すべての文字 str_view(vec,"\\W+") #すべての非文字 str_view(vec,"\\d+") #すべての数字 str_view(vec,"\\D+") #すべての非数字 str_view(vec,"\\s+") #スペース str_view(vec,"\\S+") #非スペース
- もっと深く知りたいという方はstringrのチートシートをRstudioのサイトからダウンロードしてみてください。