Rで正規表現:文字列から実数を抽出

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

以上です。