我有一个我想在文件中找到的字符串列表。如果列表中和文件中的字符串完全匹配,这将非常简单。不幸的是,名称上存在拼写错误和变体。以下是其中一些字符串不同的示例
List File
B-Arrestin Beta-Arrestin
Becn-1 BECN 1
CRM-E4 CRME4
请注意,尽管是不同的字符串,但每个对都应算作匹配。 我知道我可以对各种变化进行分类,并编写单独的REGEX来识别匹配,但这很麻烦,我可能最好手动寻找匹配。我认为我的问题的最佳解决方案是某种表达方式:
"完全匹配此字符串,但如果有不匹配的X字符,则仍将其视为匹配"
这样的事情存在吗?有没有其他方法来匹配不完全相同但接近的字符串?
答案 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模块: