【问题标题】:Regular Expression with parenthesis in a string from PyPDF2 and DataFrame with positive and negative numbersPyPDF2和DataFrame中带有正数和负数的字符串中带括号的正则表达式
【发布时间】:2017-05-03 00:25:02
【问题描述】:

我目前正在使用一个脚本,该脚本通过 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 的代码,但它在过去一年中运行良好。

【问题讨论】:

  • 您的正则表达式在“退款”之前的左括号后不包含空格。
  • 是的,但我仍然收到一个空列表 '[]' 'excessExpenses = re.findall('ExcessExpenses (/s*Refund From client)\s*(\d*\,*\ d*\.+\d+))',data)' 它仍然取决于 PyPDF2 如何拉取文档,在某些拉取文件中可能有空格,但在其他拉取文件中没有空格。我更关心正则表达式的后半部分。

标签: regex list python-3.x pandas pypdf2


【解决方案1】:

主要是拼写错误:“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+/)?)'

希望这会有所帮助。

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

【讨论】:

  • 是的!这解决了这个问题。我早些时候得到了类似的东西。 adminFee = re.findall('Administration Fees\s*(\(?\d*\,*\d*\.+\d+\)?)', data)adminFee = ''.join(adminFee)adminFee = adminFee.replace(',','')adminFee = adminFee.replace('(','-')adminFee = adminFee.replace(')','')adminFee = [adminFee]adminFee你能解释一下(?:\d*,)*吗?这会否定\d*\,*\d*吗?负数问题不是这个数字是-100,而是(100),在会计方面。找到 (100) 并将其转换为 -100 的最佳方法是什么。
  • 关于负数或正数:它们是否有括号不同?还是取决于字符串“费用”或“退款”?
  • 它们在有括号或没有括号方面的差异。例如。正面"100",负面"(100)"。在字符串的末尾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 2011-12-07
相关资源
最近更新 更多