从 OCR 图像文件中提取文本

Extracting text from OCR image file

我正在尝试从 OCR 图像中提取几个字段。我正在使用 pytesseract 读取 OCR 图像文件,这按预期工作。

代码:

import pytesseract
from PIL import Image
import re

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract- 
OCR\tesseract.exe"

value = Image.open("ocr.JPG")
text = pytesseract.image_to_string(value)
print(text)

输出:

ALS 1 Emergency Base Rate
Y A0427 RE ABC
Anbulance Mileage Charge

Y A0425 RE ABC
Disposable Supplies
Y A0398 RH ABC

184800230, x

接下来,我必须从文本中提取 A0427 和 A0425。但问题是我没有遍历整行。它一次取一个字符,这就是我的正则表达式不起作用的原因..

代码:

for line in text :
    print(line)
    x= re.findall(r'^A[0-9][0-9][0-9][0-9]', text)
    print(x)

您的正则表达式中的问题是开始锚点 ^,它期望您的匹配文本 A0425 应该从行的最开始开始,但事实并非如此,因为您有 Y 和 space 之前。所以只要从你的正则表达式中删除 ^ 然后你应该得到所有预期的字符串。此外,您可以将其中的四个 [0-9] 更改为 [0-9]{4} 并且您缩短的正则表达式变为,

A[0-9]{4}

Regex Demo

您需要像这样修改您当前的代码,

import pytesseract
from PIL import Image
import re

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract- 
OCR\tesseract.exe"

value = Image.open("ocr.JPG")
text = pytesseract.image_to_string(value)

print(re.findall(r'A[0-9]{4}', text))

这应该会打印出所有匹配项,而无需逐行循环,

['A0427', 'A0425', 'A0398']

也去掉 for 循环,只使用

x= re.findall(r'A[0-9][0-9][0-9][0-9]', text)

没有任何循环。 ('remove ^ too')

text 是一个字符串,当使用 for 循环遍历字符串时 Python 的默认行为是遍历字符(因为字符串基本上是一个列表字符数)。

要遍历行,首先使用 text.splitlines():

将文本分成行
for line in text.splitlines() :
    print(line)
    x= re.findall(r'^A[0-9][0-9][0-9][0-9]', text)
    print(x)

编辑:或者使用帕特尔的答案一起跳过循环:)