【发布时间】:2011-05-08 12:53:12
【问题描述】:
我正在寻找一种使用正则表达式进行模糊匹配的方法。 我想使用 Perl,但如果有人可以推荐任何方法来做这将是有帮助的。
例如,我想匹配“New York”字样上的一个字符串,前面有一个 2 位数字。困难在于文本来自PDF的OCR,所以我想做一个模糊匹配。我想匹配:
12 New York
24 Hew York
33 New Yobk
和其他“接近”匹配(在 Levenshtein 距离的意义上),但不是:
aa New York
11 Detroit
显然,我需要指定匹配的允许距离(“模糊度”)。
据我了解,我不能使用String::Approx Perl 模块来执行此操作,因为我需要在匹配项中包含正则表达式(以匹配前面的数字)。
另外,我应该注意,这是我真正想要匹配的一个非常简化的示例,所以我不是在寻找蛮力方法。
编辑添加:
好的,我的第一个例子太简单了。我的意思不是让人们沉迷于前面的数字——对这个不好的例子感到抱歉。这是一个更好的例子。考虑这个字符串:
ASSIGNOR, BY MESHS ASSIGN1IBNTS, TO ALUSCHALME&S MANOTAC/rURINGCOMPANY, A COBPOBATlOH OF DELAY/ABE.
这实际上是说:
ASSIGNOR, BY MESNE ASSIGNMENTS, TO ALLIS-CHALMERS MANUFACTURING COMPANY, A CORPORATION OF DELAWARE
我需要做的是提取短语“ALUSCHALME&S MANOTAC/rURINGCOMPANY”和“DELAY/ABE”。 (我意识到这可能看起来很疯狂。但我是一个乐观主义者。)一般来说,模式看起来像这样:
/Assignor(, by mesne assignments,)? to (company name), a corporation of (state)/i
匹配模糊的地方。
【问题讨论】:
-
你还有更多的例子吗?这种情况可以使用 String::Approx — 只需将字符串拆分为数字部分和“纽约”部分。
-
问题可能是识别纽约部分需要模糊匹配...
-
非简化的实际案例是否涉及一个或多个固定字符串如“New York”?这个字符串可能有多长?您预计使用的允许距离范围是多少?您的示例仅显示更改的字符;你也需要处理额外/缺失的字符吗?
-
嘿,这很简单:使用
agrep:tgries.de/agrep 如果您可以劫持并使用源代码,请检查其许可证。 -
我爱 Udi Manber 的
agrep程序!一直使用它。 Udi 和他的妻子 Rachel 是我在大学里的教授。但我认为它没有被移植到 Perl。 Jarkko 在中世纪的某个时候有某种近似的 grep 模块,但在我看来,它根本不如 Udi 的方法好。检查 CPAN。
标签: regex perl fuzzy-comparison