我正在编写一个脚本,以获取扫描的pdf文件并将其转换为文本行以输入数据库。我使用re.findall从正则表达式列表中获取匹配项,以从tesseract提取的字符串中获取某些值。当正则表达式找不到匹配项时,我遇到麻烦,我希望它返回“错误”。所以我可以看到有问题。
我已经尝试了一些if / else语句,但是我似乎无法注意到None值。
from wand.image import Image as Img
import ghostscript
from PIL import Image
import pytesseract
import re
import os
def get_text_from_pdf(pendingpdf,pendingimg):
with Img(filename=pendingpdf, resolution=300) as img:
img.compression_quality = 99
img.save(filename=pendingimg)
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract'
extractedtext = pytesseract.image_to_string(Image.open(pendingimg))
os.unlink(pendingimg)
return extractedtext
def get_results(vendor,extracted_string,results):
for v in vendor:
pattern = re.compile(v)
for match in re.findall(pattern,extracted_string):
if type(match) is str:
results.append(match)
else:
results.append("Error")
return results
pendingpdf = r'J:\TBHscan07022019090315001.pdf'
pendingimg = 'Test1.jpg'
aggind = ["^(\w+)(?:.+)\n+3600",
"Ticket: (nonsensewordstothrowerror)",
"Ticket: \d+\s([0-9|/]+)",
"Product: (\w+.+)\n",
"Quantity: ([\d\.]+)",
"Truck (\w+)"]
vendor = aggind
extracted_string = get_text_from_pdf(pendingpdf,pendingimg)
results = []
print(get_results(vendor,get_text_from_pdf(pendingpdf,pendingimg),results))
答案 0 :(得分:1)
采用这种方法for match in re.findall(pattern,extracted_string):
如果re.findall(...)
找不到任何匹配项-for
循环不会甚至运行。
事先将匹配结果保存到变量中,然后-检查条件:
...
matches = re.findall(pattern, extracted_string)
if not matches:
results.append("Error")
else:
for match in matches:
results.append(match)
请注意,当遍历re.findall(...)
的结果时,支票if type(match) is str:
毫无意义,因为每个匹配项都是 string (否则,对-可能暗含了字符串的内容。)
答案 1 :(得分:1)
re.findall
在没有匹配项时返回一个空列表。所以应该很简单:
result = re.findall(my_pattern, my_text)
if result:
# Successful logic here
else:
return "Error"
答案 2 :(得分:0)
你有
for match in re.findall(pattern,extracted_string):
if type(match) is str:
results.append(match)
else:
results.append("Error")
但是re.findall()
在找不到任何内容时会返回None
,所以
for match in re.findall(pattern,extracted_string):
因为匹配为None
,所以不会输入。
您需要在match is None
循环之外检查for
。
答案 3 :(得分:0)
您可以在一行中完成此操作:
results += re.findall(pattern, extracted_string) or ["Error"]
顺便说一句,在供应商循环中编译模式不会有任何好处,因为您只使用了一次。
您的函数还可以使用单个列表理解来返回整个搜索结果:
return [m for v in vendor for m in re.findall(v, extracted_string) or ["Error"]]
您实际上想要修改并返回作为参数传递的结果列表有点奇怪。使用该功能时,可能会产生一些意想不到的副作用。
您的“错误”标志可能会在结果列表中多次出现,并且鉴于每个模式都可能返回多个匹配项,因此很难确定哪个模式未能找到值。
如果您只想在没有任何供应商模式匹配时发出错误信号,则可以对整个结果使用or ["Error"]
技巧:
return [m for v in vendor for m in re.findall(v, extracted_string)] or ["Error"]