首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模式( regex )与找到的值之间的相似性

模式( regex )与找到的值之间的相似性
EN

Stack Overflow用户
提问于 2014-05-13 14:59:36
回答 1查看 1.6K关注 0票数 5

我有一个包含文字信息的图像,并且:

  1. 我从中提取/裁剪一幅小图像。
  2. 我正在使用OCR从小图像中提取文本。
  3. 检查提取的值是否与模式匹配(浮点、日期.)如果是这样
  4. 我将值存储在数据库中。

问题是:有时ocr提取一个包含一些符号的值,因此它与模式示例不匹配:对于模式日期:

代码语言:javascript
复制
pattern = "(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)\d\d"

图像的值是

代码语言:javascript
复制
12/02/2014

但OCR提取:

代码语言:javascript
复制
12? /02 -2014

我想得到模式和提取的值之间的相似性(最近处理它),有什么方法可以做到这一点而不改变模式呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-13 15:22:40

特定的正则表达式不能用于匹配具有歧义性的模式,而不需要进行允许这种歧义性的修改。例如,如果希望允许在匹配的字符串的任意点插入额外的字符,regex模式将需要提供大量这些任意字符的规定。这使得模式很快变得丑陋:例如,虽然匹配int的模式非常简单,

代码语言:javascript
复制
\\d+

允许中间不加数字的相同模式如下所示:

代码语言:javascript
复制
(\\d\\D*)+

随着模式变得越来越大,这种方法变得越来越丑,所以这种方法不是很好。

我建议用一种实现http://en.wikipedia.org/wiki/Levenshtein_distance变体的算法代替基于模式的匹配。

最初的Levenshtein距离算法使用两个字符串,并返回需要对一个字符串进行的修改数,以便得到另一个字符串。您的算法应该采用字符串和模式。该模式应该对数字(例如,#)使用某种指示符,并将所有其他字符“按字面”处理,作为字符串字符。您将修改算法中使用的指示符函数,在向其发送#和任何数字时返回零,否则将返回1

看看有两个矩阵行的实现,它是最节省空间的。指标职能是在这一项目上执行的:

代码语言:javascript
复制
var cost = (s[i] == t[j]) ? 0 : 1;

改到

代码语言:javascript
复制
int cost = (s[i] == t[j] || (Character.isDigit(s[i]) && t[j] == '#')) ? 0 : 1;

将允许您“匹配”数字。在进行匹配之前,您的代码还可以从字符串中删除所有空格。

您可以通过检查Levenshtein距离来决定比赛的质量。零的距离表示完美的匹配;一到二的距离对于短模式来说是相当好的;五或五以上的距离可能是不可接受的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23634829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档