从 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}
您需要像这样修改您当前的代码,
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)
编辑:或者使用帕特尔的答案一起跳过循环:)
我正在尝试从 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}
您需要像这样修改您当前的代码,
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)
编辑:或者使用帕特尔的答案一起跳过循环:)