Python 如何替换特定模式下单词中的歧义字符

Python 如何替换特定模式下单词中的歧义字符,python,regex,ocr,Python,Regex,Ocr,我使用tesseract OCR从不同的文档中提取一些文本,然后使用正则表达式处理提取的文本,以查看它是否匹配特定的模式。不幸的是,OCR提取在歧义字符上会出现常见错误,例如:5:S、1:I、0:O、2:Z、4:A、8:B等。。这些错误非常常见,因此替换不明确的字符将与模式完全匹配 是否有一种方法可以通过遵循特定模式对OCR提取进行后处理并替换不明确的字符(提前提供) 预期产出(以及到目前为止我能想到的): #示例:我提取始终遵循patern[A-Z]{2}\d{5}的车牌号 #对于其他示例,模

我使用tesseract OCR从不同的文档中提取一些文本,然后使用正则表达式处理提取的文本,以查看它是否匹配特定的模式。不幸的是,OCR提取在歧义字符上会出现常见错误,例如:5:S、1:I、0:O、2:Z、4:A、8:B等。。这些错误非常常见,因此替换不明确的字符将与模式完全匹配

是否有一种方法可以通过遵循特定模式对OCR提取进行后处理并替换不明确的字符(提前提供)

预期产出(以及到目前为止我能想到的):

#示例:我提取始终遵循patern[A-Z]{2}\d{5}的车牌号
#对于其他示例,模式可能有所不同,但始终是某种阿尔法数字组合
#复杂模式可能会被忽略,并出现一些警告,如“无法解析”
进口稀土
def post_过程(模式、文本、模棱两可的内容):
#获取文本[0],检查模式
#在这种情况下,应该是字母,如果不是,尝试从dict替换,如果是,通过
#继续下一个字母,直到找到匹配项或循环整个文本
如果匹配:
复赛
其他:
#一些错误消息
一无所获
模棱两可的单词={'2':'Z','B':'8'}
#我的车牌照片文字:AZ45287
#通过对tesseract置信水平进行滤波,可以很容易地滤除噪声,尽管这并不理想
#因此,如果函数不能通过噪声找到匹配
#噪声可以忽略,而只需找到匹配项的简单功能
ocr_output=“someNoise A2452B7 no1Ze”
#位置1中的2由Z代替,B由8代替。如果该功能将
#而根据模式,位置5上的“2”应保持为2
#对ocr_输出的每个元素重复执行此操作,直到模式匹配或返回无
#任何其他功能类似(递归、生成器、其他)的方法也是可以接受的。
结果=后处理(r“[A-Z]{2}\d{5}”,ocr\U输出,不明确的dict)
如果结果为:
打印(结果)#AZ45287
否则:#结果为无
打印(“未能清除输出”)

我希望我能很好地解释我的问题,但我可以自由地要求额外的信息,就像OCR一样,很难想出一个100%安全有效的解决方案。在本例中,您可以做的是将“损坏”字符添加到正则表达式中,然后使用带有替换项的字典“规范化”匹配

这意味着你不能使用
[A-Z]{2}\d{5}
,因为在前两个大写字母中可以有一个
8
,在五个数字中可以有一个
B
。因此,您需要在这里将模式更改为
([A-Z2]{2})([\dB]{5})
。注意创建两个子组的捕获括号。要规范化每个字符,您需要两个单独的替换,因为您似乎不希望用数字部分的字母(
\d{5}
)替换数字,也不希望用字母部分的数字替换字母(
[A-Z]{2}

下面是如何在Python中实现它:

重新导入
def post_过程(模式、文本、模棱两可的_dict_1、模棱两可的_dict_2):
匹配项=列表(关于finditer(模式、文本))
如果len(匹配):
在匹配项中为x返回[f“{x.group(1).translate(dimensional_dict_1)}{x.group(2).translate(dimensional_dict_2)}”
其他:
一无所获
对于第一组,不明确的_dict_1={ord('2'):'Z'}
对于第二组,不明确的_dict_2={ord('B'):'8'}
ocr_output=“someNoise A2452B7 no1Ze”
结果=后处理(r“([A-Z2]{2})([\dB]{5})”,ocr_输出,歧义_dict_1,歧义_dict_2)
如果结果为:
打印(结果)#AZ45287
否则:#结果为无
打印(“未能清除输出”)
#=>['AZ45287']


digical\u dict\u 1
字典包含数字到字母的替换,而
digical\u dict\u 2
包含字母到数字的替换。

对于digical\u dict.items()中的c,r():ocr\u output=ocr\u output.replace(c,r)
?尝试@YevhenKuzmovych我不想更改所有值,但只更改某些特定值,与父亲相配。例如,位置1中的“2”应改为Z,而位置5中的“2”应保持为2,根据文章中的说明,我的方法如何?