我有一個包含彩票中獎者的 PDF 檔案,我想根據他們的獎品提取所有中獎彩票。
PDF檔案
我試過這個:
import re
import pdfplumber
prize_re = re.compile(r"^\d[a-z]")
cons_prize_re = re.compile(r"^Cons")
ticket1_line_re = re.compile(r"^\d[)]")
ticket2_line_re = re.compile(r"^\d{4}")
ticket3_line_re = re.compile(r"[A-Z] \d{6}")
with pdfplumber.open("./test11.pdf") as pdf:
for i in range(len(pdf.pages)):
page_text = pdf.pages[i].extract_text()
for line in page_text.split("\n"):
if prize_re.match(line) or cons_prize_re.match(line) or ticket1_line_re.match(line) or ticket2_line_re.match(line) or ticket3_line_re.search(line):
print(line)
我知道了,我不知道如何將每張票分配給它的獎品,而且 Cons 獎品票號似乎有點奇怪我不知道為什么(應該是 AN 867952AO 867952AP => AN 867952 AO 867952 AP .. .):
1st Prize Rs :7000000/- 1) AU 867952 (MANANTHAVADY)
Cons Prize-Rs :8000/- AN 867952AO 867952AP 867952 AR 867952AS 867952
AT 867952 AV 867952 AW 867952AX 867952AY 867952
AZ 867952
2nd Prize Rs :500000/- 1) AZ 499603 (ADOOR)
3rd Prize Rs :100000/- 1) AN 215264 (KOTTAYAM)
2) AO 852774 (PATTAMBI)
3) AP 953655 (KOTTAYAM)
4) AR 638904 (PAYYANUR)
5) AS 496774 (VAIKKOM)
6) AT 878990 (WAYANADU)
7) AU 703702 (PUNALUR)
8) AV 418446 (WAYANADU)
9) AW 994685 (KOZHIKKODE)
10) AX 317550 (PATTAMBI)
11) AY 854780 (CHITTUR)
12) AZ 899905 (KARUNAGAPALLY
...
相反,我想得到:
[
{
"1st Prize Rs :7000000",
"tickets": [
"AU 867952"
]
},
{
"Cons Prize-Rs :8000",
"tickets": [
"AN 867952",
"AO 867952",
"AP 867952",
"AR 867952",
...
]
},
...
]
我怎樣才能做到這一點?
uj5u.com熱心網友回復:
您可以首先從捕獲組中的所有頁面獲取所有完整部分。
然后,您可以在處理第三個捕獲組后獲得單獨的“票證”,并在回圈中創建所需的資料結構。
對于第一個單獨的組,您可以使用與每個獎品部分的開始相匹配的模式,并捕獲所有值,直到下一個獎品部分。
^(\w Prize[-\s]Rs\s*):(\d )/-(?:\s*\d \))?\s*(.*(?:\n(?!\w Prize\b).*)*)
正則運算式演示
對于后處理,您可以使用票證格式的模式,該模式匹配 2 個大寫字符、空格和 6 位數字,或 4 個或更多數字后跟空白邊界。
(?:[A-Z]{2} \d{6}(?!\d)|(?<!\S)\d{4,}(?!\S))
正則運算式演示
使用問題中的 pdf 檔案的示例代碼:
import re
import pdfplumber
import json
pattern = r"^(\w Prize[-\s]Rs\s*):(\d )/-(?:\s*\d \))?\s*(.*(?:\n(?!\w Prize\b).*)*)"
with pdfplumber.open("./test11.pdf") as pdf:
all_text = ""
for page in pdf.pages:
all_text = '\n' page.extract_text()
matches = re.finditer(pattern, all_text, re.MULTILINE)
coll = []
for matchNum, match in enumerate(matches):
dct = {}
dct[match.group(1)] = match.group(2)
dct["tickets"] = re.findall(r"(?:[A-Z]{2} \d{6}(?!\d)|(?<!\S)\d{4,}(?!\S))", match.group(3))
coll.append(dct)
print(json.dumps(coll, indent=4))
輸出
[
{
"1st Prize Rs ": "120000000",
"tickets": [
"XG 218582"
]
},
{
"Cons Prize-Rs ": "500000",
"tickets": [
"XA 218582",
"XB 218582",
"XC 218582",
"XD 218582",
"XE 218582"
]
},
{
"2nd Prize Rs ": "5000000",
"tickets": [
"XA 788417",
"XB 161796",
"XC 319503",
"XD 713832",
"XE 667708",
"XG 137764"
]
},
....
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/447052.html
標籤:Python 正则表达式 pdf 文本提取 pdf管道工
下一篇:使用iText5向PDF添加水印
