【问题标题】:regex pattern a few numbers followed by the letter "k"正则表达式模式几个数字后跟字母“k”
【发布时间】:2018-06-17 15:12:33
【问题描述】:

我想将字符串中的 k 替换为 000。例如,我想将“£50k”变成“£50000”。请注意,该函数可以应用于像“£50k king”这样的情况,结果应该是“£50000 king”。

这是我目前所拥有的:

replace_k = function(data){
data = gsub("^[0-9]k", "[0-9]000", data)
return(data)
} 

【问题讨论】:

标签: r regex


【解决方案1】:

怎么样

data = gsub("([0-9]+)k", "\\1000", data)

【讨论】:

  • 谢谢,成功了!我也尝试用gsub("([0-9]+) mil", "\\1000000", data) 对“150 万英镑”做同样的事情,但它替换为“1.5000000 英镑”。有什么建议吗?
  • 您必须使用gsub("([0-9]+).([0-9]) mil", "\\1\\200000", data),但这仅涵盖数以百万计的精确到一位小数。如果您有更多可能的情况,您必须确定要使用的正确模式,也许先解析数字,乘以后缀,然后替换。
  • 谢谢!帮了大忙!
  • \\1000 在这里是什么意思?该代码有效,但我不明白如何
  • \\1 是第一个子匹配项(即[0-9]+,因此是k 之前的数字)。 \\1000 然后表示获取该数字并将000 附加到它们,将5k 更改为5000
【解决方案2】:

您可以使用以下解决方案来处理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+ 位捕获到第 1 组,然后将 KMG 捕获到第 2 组,gsubfn 用于操作找到的以这样一种方式匹配,即找到的数字与使用简单帮助器 ToDigits 函数获得的正确值相乘(如果 K 在第 2 组中,则与 1000 相乘等)

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

> 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多