Rの 正規表現 を利用して 文字列 から 実数 を抽出します。
サンプルとするテキストは次の通りです。
text <- "商品の価格は 123.45 ドル、在庫は -678 個、クーポンは +.9E-2 円引きです。また、製品Aのロットは 1.2e+3、製品Bは .5 です。テストとして 0. や 0.0 も試します。"続いて実数を取り出す正規表現は以下の通りです
real_number_pattern <- "[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?"始めに関数gregexpr と 関数regmatches を利用する方法です。
# gregexpr() でマッチした位置情報を取得
# perl=TRUE を指定してPCRE (Perl Compatible Regular Expressions) エンジンを利用します
match_positions <- gregexpr(real_number_pattern, text, perl = TRUE)
# regmatches() でマッチした文字列を抽出
# gregexpr() の結果はリストですので、[[1]] で最初の要素(文字列)にアクセス
extracted_numbers_baseR <- regmatches(text, match_positions)[[1]]
# 結果の表示
print("--- Base R での抽出 ---")
print(extracted_numbers_baseR)[1] "--- Base R での抽出 ---"
[1] "123.45" "-678" "+.9E-2" "1.2e+3" ".5" "0." "0.0" 抽出された文字列は文字型ですので数値型に変換します。
numeric_numbers_baseR <- as.numeric(extracted_numbers_baseR)
print("--- Base R (数値型に変換後) ---")
print(numeric_numbers_baseR)[1] "--- Base R (数値型に変換後) ---"
[1] 123.450 -678.000 0.009 1200.000 0.500 0.000 0.000続いて stringrパッケージ の関数str_extract_all を利用する方法です。
library(stringr)
# str_extract_all() でマッチするすべての文字列を抽出
# 結果はリストですので、[[1]] で最初の要素(文字列)にアクセス
extracted_numbers_stringr <- str_extract_all(text, real_number_pattern)[[1]]
# 結果の表示
print("--- stringr での抽出 ---")
print(extracted_numbers_stringr)[1] "--- stringr での抽出 ---"
[1] "123.45" "-678" "+.9E-2" "1.2e+3" ".5" "0." "0.0" こちらも抽出された文字列は文字型ですので数値型に変換します。
numeric_numbers_stringr <- as.numeric(extracted_numbers_stringr)
print("--- stringr (数値型に変換後) ---")
print(numeric_numbers_stringr)[1] "--- stringr (数値型に変換後) ---"
[1] 123.450 -678.000 0.009 1200.000 0.500 0.000 0.000以上です。

