使用正则表达式过滤 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']