1

我目前正在使用一个脚本,该脚本通过 PyPDF2 将 PDF 拉到一个字符串中,然后使用正则表达式在该 PDF 中搜索括号中的费用金额。然后在 pd.DataFrame 中汇总和处理这些费用,并将结果输出到 CSV 文件。

一切都很好,直到发出退款。基本上所有费用都包含在括号内,我会使用 re 来搜索 x 费用,例如。

adminFee = re.findall('Administration Fees\s*\((.*?)\)', data) 

然后将其添加到 totalFees 列表中

totalFees = adminFee + govFee + commFee....ect. 

然后将该列表转换为 DataFrame 以进行操作。

最近,PDF 的格式更改为包含更多费用字符串。这有时也可能构成退款。我用 re 搜索的字符串看起来像这样

""Excess Expenses (Refund from client) (150.00)""

或者

""Excess Expenses (Refund from client) 200.00""

我的第一个问题是括号,我尝试了以下无济于事

excessExpenses = re.findall('Excess expenses \(Refund From client\)\s*(\d*\,*\d*\.+\d+\))',data)

但它返回一个空列表[]?我已经尝试了几个re,但似乎都没有工作。

我的下一个问题是,以前这些都是所有费用(负金额),但现在包括正值和退款。这与 DataFrame 计算相混淆。我应该如何最好地解决这个问题。我可以回到括号内的先前费用,并通过以下方式将它们设为负数:

adminFee = re.findall('Administration Fees\s*(\(?.*?\)?)',data)
adminFee = ''.join(adminFee) 
adminFee = adminFee.replace(',','') #for float manipulation in dataframe
adminFee = adminFee.replace('(','-') # replace ( to make -
adminFee = adminFee.replace(')','') #remove last braket
adminFee = [adminFee] #make list again

然后提取正数,这将允许正确计算 DataFrame,减少费用并增加退款。

或者跟随另一个根会更可取吗?

我知道这段代码可能是你见过的最少的 Python 代码,但它在过去一年中运行良好。

4

1 回答 1

0

主要是拼写错误:“Refund”之前的左括号后缺少空格,“Expenses”中的“E”是小写的“e”,数字后面有多余的右括号“\)”。这个应该工作:

'Excess Expenses\s*\(\s*Refund From client\)\s*(\d*\,*\d*\.+\d+)'

但这不是最好的解决方案。你永远不会有超过一个点,所以不需要量词“+”。“?” 可以。如果您要处理数百万个以上的问题,您可能想要处理多个逗号,顺便说一下,它不需要转义,所以用 '\d*\,*' 这会更好:'(?:\d *,)*'。最后,要匹配负数,只需在开头添加一个可选的减号:'-?'。

把它放在一起你得到:

'Excess Expenses\s*\(\s*Refund From client\)\s*(-?/(?(?:\d*,)*\d*\.?\d+/)?)'

希望这可以帮助。

编辑:我添加了可选括号(与您的评论相同。)“(?:”表示非捕获组,即可以通过“*”量化而不被捕获为单独结果组的组。

于 2016-12-17T11:46:37.867 回答