Perl - 如何匹配不完全相同的字符串?

时间:2014-11-04 21:00:57

标签: regex string perl

我有一个我想在文件中找到的字符串列表。如果列表中和文件中的字符串完全匹配,这将非常简单。不幸的是,名称上存在拼写错误和变体。以下是其中一些字符串不同的示例

List          File
B-Arrestin    Beta-Arrestin
Becn-1        BECN 1
CRM-E4        CRME4

请注意,尽管是不同的字符串,但每个对都应算作匹配。 我知道我可以对各种变化进行分类,并编写单独的REGEX来识别匹配,但这很麻烦,我可能最好手动寻找匹配。我认为我的问题的最佳解决方案是某种表达方式:

"完全匹配此字符串,但如果有不匹配的X字符,则仍将其视为匹配"

这样的事情存在吗?有没有其他方法来匹配不完全相同但接近的字符串?

2 个答案:

答案 0 :(得分:5)

作为200_success pointed out,您可以使用Text::Fuzzy进行模糊匹配,Levenshtein distance计算文本位之间的{{3}}。您将必须使用您想要允许的最大Levenshtein距离,但如果您进行不区分大小写的比较,则样本数据中的最大距离为3:

use strict;
use warnings;
use 5.010;

use Text::Fuzzy;

my $max_dist = 3;

while (<DATA>) {
    chomp;
    my ($string1, $string2) = split ' ', $_, 2;

    my $tf = Text::Fuzzy->new(lc $string1);
    say "'$string1' matches '$string2'" if $tf->distance(lc $string2) <= $max_dist;
}

__DATA__
B-Arrestin    Beta-Arrestin
Becn-1        BECN 1
CRM-E4        CRME4

输出:

'B-Arrestin' matches 'Beta-Arrestin'
'Becn-1' matches 'BECN 1'
'CRM-E4' matches 'CRME4'

答案 1 :(得分:3)

有CPAN模块: