使用正则表达式过滤 pytesseract 结果
Filtering through pytesseract results using regex
我正在使用 pytesseract
从图像中提取名称(图像是名称的边界框,因此它只是名称本身,没有其他任何内容)
我得到了不错的结果,但是因为我的 roi 选择不是很好,有时我会在我不关心的东西上得到边界框。
我想到了将 pytesseract-engine
应用到所有图像,然后仅保存 return 值全部大写且不同于全部大写但两个特定单词的图像我仍然不关心。
这是代码:
# Adding custom options
folder = r"C:\Users\lenovo\PycharmProjects\SoftOCR_Final\names"
custom_config = r'--oem 3 --psm 6'
words = []
regex = r"\b[A-Z]+(?:\s+[A-Z]+)*\b"
for img in glob.glob(rf"{folder}\*.png") or range(20):
text = pytesseract.image_to_string(img, config=custom_config)
if re.search(regex, text) and text != 'NOM' and text != 'PRENOM':
words.append(text)
print(words)
我仍然得到这样的值:以粗体突出显示
['HAREFED\n\x0c', 'ACHRAF\n\x0c', 'MANSOUR\n\x0c', 'Nom et Prénom
Surveillant(s) | Signature(s)\nTE Rakes |*nFabel Sha!* ——
|\n|\n\x0c', 'ZAOQUAM\n\x0c', 'OUMAYMA\n\x0c']
我只想要像这些名称这样的值:以粗体突出显示
['HAREFED\n\x0c', 'ACHRAF\n\x0c', 'MANSOUR\n\x0c', 'Nom et
Prénom Surveillant(s) | Signature(s)\nTE Rakes |\nFabel Sha! ——
|\n|\n\x0c', 'ZAOQUAM\n\x0c', 'OUMAYMA\n\x0c']
请有人帮忙,我觉得我离破解这个问题很近了。不过我可能是错的;我真的只是一个初学者。
我很难理解你想做什么,但如果你想抓住全部大写的单词,你可以这样做:
re.match('[A-Z]+$', text.rstrip())
请注意,我去掉了字符串末尾的垃圾,因此它变成了全大写的单词。这就是你想要的吗?
>>> [re.match(r'[A-Z]+$', s.strip()) for s in ['HAREFED\n\x0c', 'ACHRAF\n\x0c', 'MANSOUR\n\x0c', 'Nom et Prénom Surveillant(s) | Signature(s)\nTE Rakes |\nFabel Sha! —— |\n|\n\x0c', 'ZAOQUAM\n\x0c', 'OUMAYMA\n\x0c']]
[
<re.Match object; span=(0, 7), match='HAREFED'>,
<re.Match object; span=(0, 6), match='ACHRAF'>,
<re.Match object; span=(0, 7), match='MANSOUR'>,
None,
<re.Match object; span=(0, 7), match='ZAOQUAM'>,
<re.Match object; span=(0, 7), match='OUMAYMA'>
]
如果就这么简单,那么您根本不需要正则表达式,只需检查 text == text.upper():
>>> terms = ['HAREFED\n\x0c', 'ACHRAF\n\x0c', 'MANSOUR\n\x0c', 'Nom et Prénom Surveillant(s) | Signature(s)\nTE Rakes |\nFabel Sha! —— |\n|\n\x0c', 'ZAOQUAM\n\x0c', 'OUMAYMA\n\x0c']
>>> [s.strip() for s in terms if s==s.upper()]
# ['HAREFED', 'ACHRAF', 'MANSOUR', 'ZAOQUAM', 'OUMAYMA']
我正在使用 pytesseract
从图像中提取名称(图像是名称的边界框,因此它只是名称本身,没有其他任何内容)
我得到了不错的结果,但是因为我的 roi 选择不是很好,有时我会在我不关心的东西上得到边界框。
我想到了将 pytesseract-engine
应用到所有图像,然后仅保存 return 值全部大写且不同于全部大写但两个特定单词的图像我仍然不关心。
这是代码:
# Adding custom options
folder = r"C:\Users\lenovo\PycharmProjects\SoftOCR_Final\names"
custom_config = r'--oem 3 --psm 6'
words = []
regex = r"\b[A-Z]+(?:\s+[A-Z]+)*\b"
for img in glob.glob(rf"{folder}\*.png") or range(20):
text = pytesseract.image_to_string(img, config=custom_config)
if re.search(regex, text) and text != 'NOM' and text != 'PRENOM':
words.append(text)
print(words)
我仍然得到这样的值:以粗体突出显示
['HAREFED\n\x0c', 'ACHRAF\n\x0c', 'MANSOUR\n\x0c', 'Nom et Prénom Surveillant(s) | Signature(s)\nTE Rakes |*nFabel Sha!* —— |\n|\n\x0c', 'ZAOQUAM\n\x0c', 'OUMAYMA\n\x0c']
我只想要像这些名称这样的值:以粗体突出显示
['HAREFED\n\x0c', 'ACHRAF\n\x0c', 'MANSOUR\n\x0c', 'Nom et Prénom Surveillant(s) | Signature(s)\nTE Rakes |\nFabel Sha! —— |\n|\n\x0c', 'ZAOQUAM\n\x0c', 'OUMAYMA\n\x0c']
请有人帮忙,我觉得我离破解这个问题很近了。不过我可能是错的;我真的只是一个初学者。
我很难理解你想做什么,但如果你想抓住全部大写的单词,你可以这样做:
re.match('[A-Z]+$', text.rstrip())
请注意,我去掉了字符串末尾的垃圾,因此它变成了全大写的单词。这就是你想要的吗?
>>> [re.match(r'[A-Z]+$', s.strip()) for s in ['HAREFED\n\x0c', 'ACHRAF\n\x0c', 'MANSOUR\n\x0c', 'Nom et Prénom Surveillant(s) | Signature(s)\nTE Rakes |\nFabel Sha! —— |\n|\n\x0c', 'ZAOQUAM\n\x0c', 'OUMAYMA\n\x0c']]
[
<re.Match object; span=(0, 7), match='HAREFED'>,
<re.Match object; span=(0, 6), match='ACHRAF'>,
<re.Match object; span=(0, 7), match='MANSOUR'>,
None,
<re.Match object; span=(0, 7), match='ZAOQUAM'>,
<re.Match object; span=(0, 7), match='OUMAYMA'>
]
如果就这么简单,那么您根本不需要正则表达式,只需检查 text == text.upper():
>>> terms = ['HAREFED\n\x0c', 'ACHRAF\n\x0c', 'MANSOUR\n\x0c', 'Nom et Prénom Surveillant(s) | Signature(s)\nTE Rakes |\nFabel Sha! —— |\n|\n\x0c', 'ZAOQUAM\n\x0c', 'OUMAYMA\n\x0c']
>>> [s.strip() for s in terms if s==s.upper()]
# ['HAREFED', 'ACHRAF', 'MANSOUR', 'ZAOQUAM', 'OUMAYMA']