提取美元金额

时间:2020-06-19 16:13:19

标签: python regex pandas dataframe match

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

"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)中创建一个称为“美元”的列

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-

2 个答案:

答案 0 :(得分:1)

您可以使用:

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

Regex demo

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

答案 1 :(得分:1)

您可以使用

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

请参见regex demo

详细信息

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