Я пытаюсь извлечь несколько полей из изображения 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)
2
Praveenks 1 Май 2019 в 12:34

3 ответа

Лучший ответ

Избавьтесь от этого для цикла также, используйте только

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

Без всякой петли. («Удалить ^ тоже»)

2
Patel 1 Май 2019 в 09:41

text - это строка, поведение по умолчанию для Python при циклическом цикле по строке с использованием for - цикл для циклического перемещения по символам (поскольку строка в основном представляет собой список символов).

Чтобы перебрать строки, сначала разбейте текст на строки, используя 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)

РЕДАКТИРОВАТЬ: Или используйте ответ Patels, чтобы пропустить цикл все вместе :)

1
gerwin 1 Май 2019 в 09:42

Проблема в вашем регулярном выражении - это начальный якорь ^, который ожидает, что ваш соответствующий текст A0425 должен начинаться с самого начала строки, и это действительно не тот случай, так как у вас есть Y и пробел перед ним , Так что просто удалите ^ из вашего регулярного выражения, и тогда вы получите все ожидаемые строки. Кроме того, вы можете изменить четыре из этого [0-9], чтобы написать как [0-9]{4}, и ваше сокращенное регулярное выражение становится,

A[0-9]{4}

Демонстрация Regex

Вам нужно изменить ваш текущий код, например,

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']
1
Pushpesh Kumar Rajwanshi 1 Май 2019 в 09:55