使用所有可能的组合创建字符串

2024-09-30 16:35:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是OCR算法(基于tesseract),它很难识别某些字符。我已经通过创建自己的“后处理哈希表”部分地解决了这个问题,其中包括对字符。例如,由于文本只是数字,我发现如果文本中有Q字符,那么它应该是9。在

但是,我对68字符有一个更严重的问题,因为它们都被识别为B。现在,既然我知道我在寻找什么(当我将图像转换为文本时),并且字符串相当短(6~8位数字),我想用6和{}的所有可能组合创建字符串,并将它们与我要查找的字符串进行比较。在

例如,OCR可以识别以下字符串:

L0B7B0B5

所以这里的每个B可以是6或{}。在

现在我想生成一个如下所示的列表:

^{pr2}$

所以这是一个三位数的二进制表,在这个例子中有8个选项。但是字符串中B字符的数量可以不是3个(可以是任何数字)。在

我尝试过使用Pythonitertools模块来实现以下功能:

list(itertools.product(*["86"] * 3))

结果如下:

[('8', '8', '8'), ('8', '8', '6'), ('8', '6', '8'), ('8', '6', '6'), ('6', '8', '8'), ('6', '8', '6'), ('6', '6', '8'), ('6', '6', '6')]

我想我以后可以用它来交换B字符。但是,由于某些原因,我无法使itertools在我的环境中工作。我假设这与我使用的Jython而不是纯Python有关。在

我很乐意听到关于如何完成这项任务的任何其他想法。也许有一个我没有想到的更简单的解决方案?在


Tags: 字符串图像文本算法列表二进制数字字符
2条回答

itertools.product接受可以使用的repeat关键字:

In [92]: from itertools import product

In [93]: word = "L0B7B0B5"

In [94]: subs = product("68", repeat=word.count("B"))

In [95]: list(subs)
Out[95]: 
[('6', '6', '6'),
 ('6', '6', '8'),
 ('6', '8', '6'),
 ('6', '8', '8'),
 ('8', '6', '6'),
 ('8', '6', '8'),
 ('8', '8', '6'),
 ('8', '8', '8')]

那么一个相当简洁的替换方法是使用stringreplace方法执行一个缩减操作:

^{pr2}$

另一种方法,使用itertools中的多个函数:

In [90]: from itertools import chain, izip_longest

In [91]: subs = product("68", repeat=word.count("B"))

In [92]: [''.join(chain(*izip_longest(word.split('B'), sub, fillvalue=''))) for sub in subs]
Out[92]: 
['L0676065',
 'L0676085',
 'L0678065',
 'L0678085',
 'L0876065',
 'L0876085',
 'L0878065',
 'L0878085']

这里是生成字符串的简单递归函数:-(它是一个伪代码)

permut(char[] original,char buff[],int i) {


 if(i<original.length) {

      if(original[i]=='B') {

          buff[i] = '6'
          permut(original,buff,i+1)
          buff[i] = '8'
          permut(original,buff,i+1)
      } 

     else if(original[i]=='Q') {

          buff[i] = '9'
          permut(original,buff,i+1)
      }

      else {

          buff[i] = ch[i];
          permut(original,buff,i+1) 
      }
 }

 else {

      store buff[]     

  }


}

相关问题 更多 >