我正在使用pdfplumber.page.extract_text()從銀行對賬單中提取文本。文本似乎已正確提取,但我無法使用正則運算式提取日期、型別、描述和金額。但我想不出一種干凈的方法來捕獲多行描述。我希望將金色框中的描述文本與金色框之前的行中的描述文本分組。
正則運算式模式
re.findall(r'(\d{2}\/\d{2})\s*([\w ]*)([$\d.,]*)(\s{2})([$\d.,]*).*\s(?=\w*)', text)
正則運算式描述
(\d{2}\/\d{2}) - Capture date
([\w ]*) - Capture description
([$\d.,]*) - Capture expense amount
([$\d.,]*) - Capture deposit amount
(?=\w*) - Positive Lookahead for any text below
輸入
0 0 $12,345.67
08/27 DEBIT CARD PURCHASE XXXXXX 5541XXXXXX $1.23 0 $123,456.78
RACETRAC467 00004671 PLEASANTVILLEPA
08/27 BANK FUNDS TRANSFER DB $45.67 0 $124,816.32
TO SMITH,JOHN
SAVINGS #0001, CONF# 8675309
continued on next page>>>
987654-3210
Page 1 of 11
電流輸出
['08/27', 'DEBIT CARD PURCHASE XXXXXX 5541XXXXXX ', '$1.23', ' ', '0', ' $123,456.78 ']
['08/27', 'BANK FUNDS TRANSFER DB ', '$45.67', ' ', '0', ' $124,816.32 ']
期望的輸出
['08/27', 'DEBIT CARD PURCHASE XXXXXX 5541XXXXXX RACETRAC467 00004671 PLEASANTVILLEPA ', '$1.23', ' ', '0', ' $123,456.78 ']
['08/27', 'BANK FUNDS TRANSFER DB TO SMITH,JOHN SAVINGS #0001, CONF# 8675309 ', '$45.67', ' ', '0', ' $124,816.32 ']
uj5u.com熱心網友回復:
您可以將以下行的描述(例如,不以日期或“續”或頁面和數字開頭)添加到您已有的描述中。
在您使用的模式中,[\w ]*但這也只能匹配空格。如果應該至少有一個單詞字符,您可以使用\w[\w ]*
您也可以省略這部分中的捕獲組,(\s{2})因為它將回傳一個僅包含空格的條目。
(?P<date>\d{2}/\d{2})\s (?P<desc>\w[\w ]*)(?P<expense>\$[\d.,]*)\s{2}(?P<deposit>\d[\d.,]*)\s.*(?P<desc_more>(?:\n(?!\d \/\d|continued\b|Page\s \d).*)*)
模式匹配:
(?P<date>\d{2}/\d{2})團體日期\s匹配 1 個空格字符(?P<desc>\w[\w ]*)組desc匹配單詞字符和空格(?P<expense>\$[\d.,]*)團體費用匹配$和可選數字.或,\s{2}匹配 2 個空格字符(?P<deposit>\d[\d.,]*)團體存款匹配一個數字和可選數字.或,\s.*匹配單個空白字符和該行的其余部分(?P<desc_more>組desc_more(?:非捕獲組作為一個整體匹配\n(?!\d \/\d|continued\b|Page\s \d).*匹配換行符,如果它不是以類似日期的模式或任何其他替代方式開頭,則匹配該行的其余部分
)*關閉非捕獲組并可選擇重復
)關閉組desc_more
請參閱正則運算式演示和Python 演示。
使用命名捕獲組的示例和match.groupdict():
import re
pattern = r"(?P<date>\d{2}/\d{2})\s (?P<desc>\w[\w ]*)(?P<expense>\$[\d.,]*)\s{2}(?P<deposit>\d[\d.,]*)\s.*(?P<desc_more>(?:\n(?!\d \/\d|continued\b|Page\s \d).*)*)"
s = (" 0 0 $12,345.67 \n"
"08/27 DEBIT CARD PURCHASE XXXXXX 5541XXXXXX $1.23 0 $123,456.78\n"
"RACETRAC467 00004671 PLEASANTVILLEPA\n"
"08/27 BANK FUNDS TRANSFER DB $45.67 0 $124,816.32\n"
"TO SMITH,JOHN\n"
"SAVINGS #0001, CONF# 8675309\n"
"continued on next page>>>\n"
" 987654-3210\n"
"Page 1 of 11\n"
"07/27 DEBIT CARD PURCHASE XXXXXX 6541XXXXXX $2.23 0 $223,456.78")
matches = re.finditer(pattern, s)
for _, match in enumerate(matches):
d = match.groupdict()
d.update({'desc': re.sub(r"[^\S\n]*\n", " " , match.groupdict().get('desc') match.groupdict().get('desc_more'))})
del d["desc_more"]
print(d)
輸出
{'date': '08/27', 'desc': 'DEBIT CARD PURCHASE XXXXXX 5541XXXXXX RACETRAC467 00004671 PLEASANTVILLEPA', 'expense': '$1.23', 'deposit': '0'}
{'date': '08/27', 'desc': 'BANK FUNDS TRANSFER DB TO SMITH,JOHN SAVINGS #0001, CONF# 8675309', 'expense': '$45.67', 'deposit': '0'}
{'date': '07/27', 'desc': 'DEBIT CARD PURCHASE XXXXXX 6541XXXXXX ', 'expense': '$2.23', 'deposit': '0'}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462049.html
