我正在寻找一种方法使用正则表达式进行模糊匹配。我想使用Perl,但如果有人可以推荐任何方式来做这将是有帮助的。

例如,我想匹配字词“New York”前面的一个2位数字。困难来自于文本是从PDF的OCR,所以我想做一个模糊匹配。我想匹配:

12 New York
24 Hew York
33 New Yobk

和其他“关闭”匹配(在Levenshtein距离的意义上),但不是:

aa New York
11 Detroit

显然,我需要指定匹配的允许距离(“模糊性”)。

根据我的理解,我不能使用String :: Approx Perl模块来做到这一点,因为我需要在我的匹配中包含一个正则表达式(匹配前面的数字)。

此外,我应该注意,这是一个非常简化的例子,我真的想匹配,所以我不是在寻找一个暴力方法。

已编辑以添加:

好吧,我的第一个例子太简单了。我不是想让人们挂在前面的数字 – 对不起的例子。这里有一个更好的例子。考虑这个字符串:

指派者,通过MESHS ASSIGN1IBNTS,ALUSCHALME& S MANOTAC / RURINGCOMPANY,A COBPOBAT1OH DELTA / ABE。

这其实是说:

指派者,按照MESNE分配,ALLIS-CHALMERS制造公司,DELAWARE公司

我需要做的是提取短语“ALUSCHALME& S MANOTAC / rURINGCOMPANY”和“DELAY / ABE”。 (我意识到这可能看起来像疯狂,但我是一个乐观主义者。)一般来说,模式将看起来像这样:

/ Assignor(,通过mesne赋值)?到(公司名称),(州)的公司/ i

其中匹配是模糊的。

如果你有一个模式,你想找到一个文本集合的最佳匹配,你可以尝试q-gram距离。它很容易实现和采纳特殊需求。

你的第二个描述实际上在这里是有帮助的,因为模式和文本应该相当长。 q-gram距离不能像“York”这样的单词很好地工作,但是如果你的典型模式是一个完整的地址,那应该很好。

尝试这样:

>将你的文本和模式转换为缩小的字符集,如大写字母,剥离,文字(单词之间的一个空格)所有符号替换为“#”或某事。
>选择q-gram长度,以使用。尝试3或2.我们称之为q = 3。
>建立每个文本的qgram-profile:
>将每个文本拆分为q字,即。 NEW_YORK变为[NEW,EW_,W_Y,_YO,ORK],将其与每个文本一起保存。
>如果你搜索你的模式,然后,你做同样的模式,
>循环通过你的text-qgram数据库和

>计数每个模式/文本对有多少qgram是相同的。
>每个命中将提高分数1。

>具有最高分数的文本是您最好的点击。

如果你这样做,你可以调整这个算法:

>添加所有的文本(以及搜索之前的模式),与q-1特殊字符,所以即使你的短语将得到一个体面的配置文件。例如纽约成为^^纽约$$。
>你甚至可以用“x”替换所有辅音,用“o”替代元音,等等。以这种方式玩几个字符类,或者甚至通过替换一组字符来创建超级符号,即CK变成K,或SCH变成$。
>当通过qgram命中提高分数时,您可以通过其他事情调整值1,如文本的长度差异vs模式。
>存储2克和3克两者,并且当计数时,然后不同地称重。

注意,在这里描述的基本形式的该算法在搜索期间不具有良好的运行时间,即O(| T | * | P |)(其中| T |和| P |是文本和模式的总长度)。这是因为我描述你循环所有的文本,然后在你的模式。因此,这只适用于中等大小的文本库。如果你花了一些思想,你可以创建一个高级索引结构在q克(可能使用哈希表),所以这可能是实用的巨大的文本基地以及。

regex – 模糊正则表达式的更多相关文章

  1. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios – 使用大写符号在字符串swift中获取URL的正则表达式

    我尝试在文本中获取URL.所以,在此之前,我使用了这样一个表达式:但是当用户输入带有大写符号的URL时(例如Http://Google.com,它与它不匹配)我遇到了问题.我试过了:但什么都没发生.解决方法您可以使用正则表达式中的i内联标志关闭区分大小写,有关可用正则表达式功能的详细信息,请参阅FoundationFrameworkReference.(?ismwx-ismwx)Flagsetti

  3. ios – 如何在Swift 3中使用正则表达式?

    解决方法我相信.当没有其他选项适用时,将使用.allZeros.因此,使用Swift3,您可以传递一个空的选项列表或省略options参数,因为它默认为无选项:要么请注意,在Swift3中,您不再使用error参数.它现在抛出.

  4. ios – lldb断点在类目标c中的所有方法

    如何使用lldb在ObjectiveC类中的所有方法上自动设置断点?

  5. swift的正则表达式(NSRegularExpression)

    init(_pattern:String){varerror:NSError?

  6. swift 正则表达式运用实例选自《swifter 100个swift开发必备tip 》

  7. 可以匹配就匹配咯: 详解 Swift 的模式匹配

    怒戳查看最终稿@SwiftGG在众多Swift提供给Objective-C程序员使用的新特性中,有个特性把自己伪装成一个无聊的老头,但是却在如何优雅滴解决“鞭尸金字塔“的问题上有着巨大的潜力。很显然我所说的这个特性就是switch语句,对于很多Objective-C程序员来说,除了用在Duff’sDevice上比较有趣之外,switch语句非常笨拙,与多个if语句相比,它几乎没有任何优势。不过Sw

  8. Swift中的模式匹配

    模式是用于匹配的规则值,如switch语句的case,do语句的catch子句,以及if、while、guard、for-in语句的条件。例如,假设你想判断一个整数是大于、小于还是等于零,你可以用if-elseif-else语句,尽管这并不美观:letx=10ifx>0{print}elseifx原文查看:http://bbs.a-coder.cn/thread-7-1-1.html

  9. 《swift2.0 官方教程中文版》 第3章-05模式

    letpoint=(3,2)switchpoint{caselet(x,y):print}//prints"Thepointisat(3,2).”/*元组模式********************************************///元组模式是逗号分隔的,有零个或多个模式的列表,并被一对圆括号括起来。枚举用例模式出现在switch语句中的case标签中,以及if,while,guard和for-in语句的case条件中。is模式和is操作符有相似表现,它们都进行类型转换,却舍弃返回的类型

  10. 模式匹配第一弹: switch, enums & where 子句

    本文作为模式匹配的第一篇介绍文章,旨在抛砖引玉。Switch基本用法Swift中最简单、最为常见的模式匹配就是switch语句,大家对下面的形式都比较熟悉了:但是switch可以更进一步,允许使用包含变量的匹配模式,并在匹配时绑定这些变量。下一部分的计划这篇文章很简单,带你回顾了swith中的一些基本的模式匹配,下一部分将探讨更高级的用法,包括:在enum之外的其他地方使用switch与其他语句一起配合使用模式匹配,包括ifcase,guardcase,forcase,=~,…

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部