正则表达式模式:几个数字后跟字母"k"。

3
我希望将字符串中的"k"替换为"000",例如,我想从"£50k"制作"£50000"。请注意,该函数可应用于类似"£50k king"的情况,其结果应为"£50000 king"。
以下是我目前的代码:
replace_k = function(data){
data = gsub("^[0-9]k", "[0-9]000", data)
return(data)
} 

2个回答

6
如何呢?
data = gsub("([0-9]+)k", "\\1000", data)

谢谢,它起作用了!我也尝试使用gsub("([0-9]+) mil", "\\1000000", data)来处理"£1.5 mil",但它替换成了"£1.5000000"。有什么建议吗? - Misha
你需要使用 gsub("([0-9]+).([0-9]) mil", "\\1\\200000", data),但这只适用于刚好有一个小数位的百万。如果有更多可能的情况,你需要确定正确的模式,也许先解析数字,乘以后缀,然后再替换。 - PhilMasteG
谢谢!帮了很多忙! - Misha
这里的 \\1000 是什么意思?代码可以运行,但我不明白它的含义。 - stevec
\\1 是第一个子匹配项(即 [0-9]+,因此是 k 前面的数字)。\\1000 表示将这些数字取出并在其后附加 000,从而将 5k 转换为 5000 - PhilMasteG

1
你可以使用以下解决方案来处理 KMG(如果需要,可以调整 ToDigits 函数以处理更多):
> library(gsubfn)
> x <- "0.56K 50K 1.5M 56.56G"
> ToDigits <- function(s) {ifelse(s=="K", 1000, ifelse(s=="M", 1000000, 1000000000)) }
> gsubfn("(\\d*\\.?\\d+)([KMG])", function(y,z) as.numeric(y) * ToDigits(z), x)
[1] "560 50000 1500000 5.656e+10"

在这里,(\\d*\\.?\\d+)([KMG])捕获0个或多个数字、.和1个或多个数字到第一组中,然后将KMG放入第二组中,并使用gsubfn来操作找到的匹配项,使找到的数字乘以正确的值(如果第二组中是K,则乘以1000等),这样就可以使用简单的辅助函数ToDigits

为了不区分大小写,您可以调整上面的代码如下:

> ToDigits <- function(s) {ifelse(tolower(s)=="k", 1000, ifelse(tolower(s)=="m", 1000000, 1000000000)) }
> gsubfn("(\\d*\\.?\\d+)([KMGkmg])", function(y,z) as.numeric(y) * ToDigits(z), x)
[1] "560 50000 1500000 5.656e+10"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接