在 R 中使用正则表达式解析字符串中的价格

Parsing price out of a character string with regex in R

提问人:Hack-R 提问时间:4/29/2016 最后编辑:Hack-R 更新时间:4/29/2016 访问量:204

问:

我的数据如下所示:

L/S Price
$555,000Previous Price: $575,000
$865,000Previous Price: $875,000
$995,000 
$1,325,000Previous Price: $1,459,000

我想要的结果是这样的:

555000
865000
995000
1325000

我能想到的最好的正则表达式是,但这有几个问题,例如还匹配“先前价格”,这只是噪音。我在正则表达式中包含逗号,以便我可以匹配整个价格,即使我最终需要删除逗号。([0-9,])+

或者,我在想我可以选择我不想要的部分,然后删除它,尽管我在实现这一点时遇到了麻烦。([a-zA-Z]).+

这里有一个:dput

> dput(mls_res$`L/S Price`[1:4])
c("$555,000Previous Price: $575,000", "$865,000Previous Price: $875,000", 
"$995,000 ", "$1,325,000Previous Price: $1,459,000")
正则表达式 R

评论


答:

1赞 akrun 4/29/2016 #1

我们可以使用捕获组 () 从字符串中捕获数字元素,然后将其替换为捕获组的反向引用(...)

as.numeric(gsub("^\\D*([0-9]+),*([0-9]+),([0-9]+).*", "\\1\\2\\3", str1))
#[1]  555000  865000  995000 1325000

或者只是匹配非数字字符并将其替换为 .""

as.numeric(gsub("[$,]|[[:alpha:]]+.*", "", str1))
#[1]  555000  865000  995000 1325000

评论

0赞 akrun 4/29/2016
注意:有偏见的赞成票是:-)
3赞 Gopala 4/29/2016 #2

使用 library ,您可以执行如下操作:stringr

library(stringr)
df <- c('$555,000Previous Price: $575,000', '$865,000Previous Price: $875,000', '$995,000', '$1,325,000Previous Price: $1,459,000')
as.numeric(gsub('\\$|,', '', str_extract(df, '^\\$[0-9,]*')))
2赞 G. Grothendieck 4/29/2016 #3

这看起来很简单,不涉及任何包。它删除 P 和此后的所有内容,然后从剩余的内容中删除所有非数字。最后,它将其转换为数字。

as.numeric(gsub("\\D", "", sub("P.*", "", s)))
## [1]  555000  865000  995000 1325000

如果最后一位数字后面可能跟着 P 以外的其他字母,则将 P 替换为 。[[:alpha:]]

注意:我们使用了以下输入:

s <- c("$555,000Previous Price: $575,000", "$865,000Previous Price: $875,000", 
       "$995,000 ", "$1,325,000Previous Price: $1,459,000")