如何从货币格式和类型不同的叙述中提取货币价值和货币?

时间:2019-09-11 02:12:27

标签: r regex

我正在尝试从一栏叙述中提取货币价值及其货币。 但是,叙述中的货币格式比较混乱。

我已经尝试过gsub(),但是不知道如何自定义它来处理不同的情况。

输入:

words <- c("sold for USD 8.5 in cash in Nov. 2005", 
           "bought in Dec. 2012 for approx. $130", 
           "sold for GBP 11 on 03/03/2010", 
           "bought for EUR 33 in cash")

预期输出:

value <- c(8.5, 130, 11, 33)
currency <- c("USD", "USD", "GBP", "EUR")

3 个答案:

答案 0 :(得分:2)

我建议使用str_extract_all()包(stringr的一部分)中的regular expressionstidyverse

第一个问题是您有一个美元符号,它不是显式的货币。如果您想假设美元符号是 USD -并且可能还有其他示例,例如英镑符号等-那么也许第一步,您可以对源代码进行一些清理文本,只需将出现的“ $”替换为“ USD”即可:

words <- c("sold for USD 8.5 in cash in Nov. 2005", 
           "bought in Dec. 2012 for approx. $130", 
           "sold for GBP 11 on 03/03/2010", 
           "bought for EUR 33 in cash")

words <- str_replace_all(words, "\\$", "USD")

然后创建一个有效货币的字符向量,您可以根据需要添加该向量:

currencies <- c("USD", "GBP", "EUR")

然后设置您的正则表达式:

regexCurrency <- paste0("(", paste0(currencies, collapse = "|"), ")")
## [1] "(USD|GBP|EUR)"

以上内容将找到任何有效的货币。

regexAmount <- "[0-9\\.]+"

上面将找到任何数字值,包括可选的小数点。

然后提取所有有效的货币/值对(即忽略不遵循货币的数字值,例如年份“ 2005”)

x <- str_extract_all(words, paste0(regexCurrency, " *", regexAmount))
[[1]]
[1] "USD 8.5"

[[2]]
[1] "USD130"

[[3]]
[1] "GBP 11"

[[4]]
[1] "EUR 33"

然后使用货币和金额正则表达式为值和货币生成单独的向量:

value <- str_extract_all(x, regexAmount) %>% unlist %>% as.numeric
## [1]   8.5 130.0  11.0  33.0

currency <- str_extract_all(, regexCurrency) %>% unlist
## [1] "USD" "USD" "GBP" "EUR"

您可能需要考虑其他情况,例如币种不同或包含逗号的数字值。这些可以通过根据需要修改正则表达式来解决。

答案 1 :(得分:2)

strapply从字符串pat(第一个参数)中提取与模式word的捕获组(即模式的括号部分)的匹配项,并分别输入捕获组函数的自变量(第三个自变量-该函数可以用代号表示,函数的主体在代字号的右侧)。它返回函数的输出。

library(gsubfn)

pat <- "(USD|GBP|EUR|\\$) *([0-9.]+)"
currency <- strapply(words, pat, ~ sub("\\$", "USD", ..1), simplify = TRUE)
value <- strapply(words, pat, ~ as.numeric(..2), simplify = TRUE)

答案 2 :(得分:1)

base 中,您可以先使用$USD更改为gsub。然后使用currencyvaluesregex提取regexprregmatches的匹配项。现在,通过此匹配,您可以使用value再次提取currencygsub

tt <- gsub("\\$", "USD", words)
tt <- regmatches(tt, regexpr("\\b(USD|GBP|EUR) *[0-9.]+", tt))
(value <- as.numeric(gsub("[^0-9.]", "", tt)))
#[1]   8.5 130.0  11.0  33.0
(currency <- gsub("[0-9. ]", "", tt))
#[1] "USD" "USD" "GBP" "EUR"