PyPDF2 和 DataFrame 中带有正数和负数的字符串中带括号的正则表达式
Regular Expression with parenthesis in a string from PyPDF2 and DataFrame with positive and negative numbers
我目前正在使用一个脚本,该脚本通过 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)
但它 returns 是一个空列表 []
?我已经尝试了几个 re's 但 none 似乎在工作。
我的下一个问题是,以前这些都是所有费用(负数),但现在包括正值和退款。这会扰乱 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 风格的代码,但它在过去一年中一直运行良好。
主要是拼写错误:'Refund' 之前的左括号后缺少 space,小写 'e' 而不是 ''Expenses' 中的 '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+/)?)'
希望对您有所帮助。
编辑: 我添加了可选括号(与您的评论中的相同。)'(?:' 表示非捕获组,即可以通过以下方式量化的组'*' 没有被捕获为单独的结果组。
我目前正在使用一个脚本,该脚本通过 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)
但它 returns 是一个空列表 []
?我已经尝试了几个 re's 但 none 似乎在工作。
我的下一个问题是,以前这些都是所有费用(负数),但现在包括正值和退款。这会扰乱 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 风格的代码,但它在过去一年中一直运行良好。
主要是拼写错误:'Refund' 之前的左括号后缺少 space,小写 'e' 而不是 ''Expenses' 中的 '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+/)?)'
希望对您有所帮助。
编辑: 我添加了可选括号(与您的评论中的相同。)'(?:' 表示非捕获组,即可以通过以下方式量化的组'*' 没有被捕获为单独的结果组。