【问题标题】:regex for large currency amounts大额货币的正则表达式
【发布时间】:2018-07-30 05:42:35
【问题描述】:

我正在尝试编写一个表达式,从具有相应货币符号和潜在金额缩写(m 或 k)的字符串中提取数字:

text <- "$10000 and $10,000 and $5m and $50m and $50.2m and $50,2m"
str_extract(text, "\\$(\\d+)[a-z]+") # solution_1
str_extract(text, "\\$(\\d+)+") #solution_2

期望的输出:

"$10000 $10,000 $5m $50m $50.2m $50,2m"

问题在于solution_1 仅提取“$5m”而solution_2 仅提取“$10000”。

更新:@Tim Biegeleisen 提供了一个很好的解决方案。我也试图最终摆脱一个时期,例如$50m. and... 获取$50m

text <- "$5, $10,000, and $5m, and $50m. and $50.2m and $50,2m"
m <- gregexpr("\\$[0-9.,]+?[mbt]?(?=(?:, | |$))", text, perl=TRUE)
regmatches(text, m)

【问题讨论】:

    标签: r regex


    【解决方案1】:

    尝试将grepexprregmatches 一起使用:

    text <- "$10000 and $10,000 and $5m and $50m and $50.2m and $50,2m"
    m <- gregexpr("\\$[0-9.,]+[mbt]?", text)
    
    regmatches(text, m)
    [[1]]
    [1] "$10000"  "$10,000" "$5m"     "$50m"    "$50.2m"  "$50,2m"
    

    Demo

    我假设只有数字、逗号和小数点才能构成给定数量的字符串。我还假设金额可能以mbt 结尾(代表百万、十亿、万亿)。

    【讨论】:

    • 完美运行,感谢您的解释!有什么方法可以包含英镑符号,这样它就可以同时匹配 100 美元和 100 英镑等?
    • @Misha 是的,只需使用类似[$£][0-9.,]+[mbt]? 的东西。
    • 后续:如果后面没有数字,即$1.2k, etc,有没有办法排除数字后面的逗号和句点,所以它返回$1.2k而不是$1.2k,
    • @Misha 我有setup a demo,这似乎可以解决您的问题。如果您有其他要求,我建议您提出一个新问题。当您不断更改需求时,您会使其他人已经完成的所有工作无效。
    • 谢谢!将开始一个新的问题以摆脱最后的句号:例如,$50m. etc
    【解决方案2】:

    也可以这样做,例如这边

    txt = unlist(strsplit(text, split = " "))
    txt[grep("\\$\\d+((,|\\.)?)(\\d*)?(m)?", txt)]
    
    [1] "$10000"  "$10,000" "$5m"     "$50m"    "$50.2m"  "$50,2m" 
    

    【讨论】:

      【解决方案3】:

      也许我们可以使用 gsub 作为 OP 的预期输出显示为单个字符串

      gsub("\\b[A-Za-z]+,?|[,.](\\s)", "\\1", text)
      #[1] "$10000  $10,000  $5m  $50m  $50.2m  $50,2m"
      #[2] "$5 $10,000  $5m  $50m  $50.2m  $50,2m"     
      

      数据

      text <- c( "$10000 and $10,000 and $5m and $50m and $50.2m and $50,2m",
            "$5, $10,000, and $5m, and $50m. and $50.2m and $50,2m")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-30
        • 1970-01-01
        • 2022-11-26
        • 2010-10-23
        • 1970-01-01
        • 2015-02-26
        • 1970-01-01
        相关资源
        最近更新 更多