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 が正しく計算され、費用が減り、払い戻しが追加されます。

それとも、別のルーツに従う方が賢明でしょうか?

このコードは、これまで見た中で最も Pythonic ではないかもしれませんが、この 1 年間はうまく機能しています。

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 に答える