【问题标题】:Extracting US dollar amount提取美元金额
【发布时间】:2020-10-09 22:49:57
【问题描述】:

之前有人问过这个问题,但我仍然无法完全完成这项工作。我有以下字符串示例:

"Transfer to Retirement Rsvs-MA FX                   .11"                
"Opening Balance                FX        342,536,002.63"     
"VA                 85.85"               
"VB                   .00"     
"Manual Adjustment              FX              6,838.36-"

我想将字符串中的美元/美分金额提取到数据框的单独列中。我有以下正则表达式:

rx = (r"(\$?(?:\d+,)*\d+\.\d+\-?)")

我尝试在数据框 (df) 中创建一个名为“dollars”的列

df2['dollars']=df2['description'].str.extract(rx)

它在大多数情况下都有效,除了 .11 或 .00 之类的值,在这种情况下会返回 nan。如何修改此表达式以使其适用于美分而不用领先美元?

非常感谢您的帮助!

string                                                       dollars
Transfer to Retirement Rsvs-MA FX                   .11      0.11
Opening Balance                FX        342,536,002.63      342,536,002.63
VA                    85.85                                  85.85
VB                   .00                                     .00
Manual Adjustment FX 6,838.36-                               6,836-

【问题讨论】:

  • 试试r'\$?(?<!\d)(?:\d{1,3}(?:,\d{3})*|\d{4,})?\.?\d+',见regex demo
  • @Wiktor Stribiżew 谢谢!这有效!

标签: python regex pandas dataframe match


【解决方案1】:

你可以使用

r'\$?(?<!\d)(?:\d{1,3}(?:,\d{3})*|\d{4,})?\.?\d+'

regex demo

详情

  • \$? - 一个可选的 $ 字符
  • (?&lt;!\d) - 确保左边没有数字
  • (?:\d{1,3}(?:,\d{3})*|\d{4,})? - 两种模式之一:
    • \d{1,3}(?:,\d{3})* - 1 到 3 位数字,后跟 0 次或多次出现的逗号和 3 位数字
    • | - 或
    • \d{4,} - 四位或更多位
  • \.? - 一个可选的点
  • \d+ - 1 位以上。

【讨论】:

    【解决方案2】:

    你可能会使用:

    (?<!\S)\$?(?:\d{1,3}(?:\,\d{3})*)?\.\d{2}-?(?!\S)
    
    • (?&lt;!\S)左边的空白边界
    • \$? 可选美元符号
    • (?:\d{1,3}(?:\,\d{3})*)? 可选部分匹配 1-3 位可选用逗号和 3 位重复的数字
    • \.\d{2} 匹配 . 和 2 位数字
    • -? 可选连字符
    • (?!\S)右边的空白边界

    Regex demo

    如果您想要点后 1 位以上的数字,请将 \.\d{2} 更改为 \.\d+

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-25
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多