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