我正在搜索“卡扎菲”这个词,这个词有很多种拼写方式。搜索这个最好的正则表达式是什么?

以下是30个变体的列表:

Gadaffi
Gadafi
Gadafy
Gaddafi
Gaddafy
Gaddhafi
Gadhafi
Gathafi
Ghadaffi
Ghadafi
Ghaddafi
Ghaddafy
Gheddafi
Kadaffi
Kadafi
Kaddafi
Kadhafi
Kazzafi
Khadaffy
Khadafy
Khaddafi
Qadafi
Qaddafi
Qadhafi
Qadhdhafi
Qadthafi
Qathafi
Quathafi
Qudhafi
Kad'afi

目前为止我最好的尝试是:

\b[KG]h?add?af?fi$\b

但我似乎还是遗漏了一些变体。有什么建议吗?


当前回答

使用CPAN模块Regexp::Assemble:

#!/usr/bin/env perl

use Regexp::Assemble;

my $ra = Regexp::Assemble->new;
$ra->add($_) for qw(Gadaffi Gadafi Gadafy Gaddafi Gaddafy
                    Gaddhafi Gadhafi Gathafi Ghadaffi Ghadafi
                    Ghaddafi Ghaddafy Gheddafi Kadaffi Kadafi
                    Kaddafi Kadhafi Kazzafi Khadaffy Khadafy
                    Khaddafi Qadafi Qaddafi Qadhafi Qadhdhafi
                    Qadthafi Qathafi Quathafi Qudhafi Kad'afi);
say $ra->re;

这将生成以下正则表达式:

(?-xism:(?:G(?:a(?:d(?:d(?:af[iy]|hafi)|af(?:f?i|y)|hafi)|thafi)|h(?:ad(?:daf[iy]|af?fi)|eddafi))|K(?:a(?:d(?:['dh]a|af?)|zza)fi|had(?:af?fy|dafi))|Q(?:a(?:d(?:(?:(?:hd)?|t)h|d)?|th)|u(?:at|d)h)afi))

其他回答

\ [KGQ] b h添加? h ?房颤?fi \ b

阿拉伯语的翻译是(维基说)“Qaḏḏāfī”,所以可能会加上一个q和一个H(“卡扎菲”,如文章(见下文)所述)。

顺便说一下,为什么在正则表达式的末尾有一个$ ?


顺便说一句,关于这个话题的文章不错:

卡扎菲,卡扎菲,还是卡扎菲?为什么这位利比亚领导人的名字有这么多种拼写方式?


EDIT

为了匹配后面提到的文章中的所有名称,这应该匹配所有名称。我们只希望它不会和其他很多东西匹配:D

\b(Kh?|Gh?|Qu?)[aeu](d['dt]?|t|zz|dhd)h?aff?[iy]\b

只是一个补充:你应该加上“Gheddafi”作为替代拼写。所以RE应该是

\b[KG]h?[ae]dd?af?fi$\b

使用CPAN模块Regexp::Assemble:

#!/usr/bin/env perl

use Regexp::Assemble;

my $ra = Regexp::Assemble->new;
$ra->add($_) for qw(Gadaffi Gadafi Gadafy Gaddafi Gaddafy
                    Gaddhafi Gadhafi Gathafi Ghadaffi Ghadafi
                    Ghaddafi Ghaddafy Gheddafi Kadaffi Kadafi
                    Kaddafi Kadhafi Kazzafi Khadaffy Khadafy
                    Khaddafi Qadafi Qaddafi Qadhafi Qadhdhafi
                    Qadthafi Qathafi Quathafi Qudhafi Kad'afi);
say $ra->re;

这将生成以下正则表达式:

(?-xism:(?:G(?:a(?:d(?:d(?:af[iy]|hafi)|af(?:f?i|y)|hafi)|thafi)|h(?:ad(?:daf[iy]|af?fi)|eddafi))|K(?:a(?:d(?:['dh]a|af?)|zza)fi|had(?:af?fy|dafi))|Q(?:a(?:d(?:(?:(?:hd)?|t)h|d)?|th)|u(?:at|d)h)afi))

为什么不采用混合的方法呢?介于所有可能性列表和匹配太多的复杂正则表达式之间的东西。

Regex是关于模式匹配的,我不能在列表中看到所有变体的模式。试着这样做,还会发现像“Gazzafy”或“Quud’haffi”这样的东西,它们很可能不是一个常用的变体,也绝对不在列表上。

但我可以看到一些变异的模式,所以我得出了这个结论:

\b(?:Gheddafi|Gathafi|Kazzafi|Kad'afi|Qadhdhafi|Qadthafi|Qudhafi|Qu?athafi|[KG]h?add?h?aff?[iy]|Qad[dh]?afi)\b

在一开始,我列出了那些我看不到模式的,然后是一些有模式的变体。

请访问www.rubular.com

既然你在匹配小词,为什么不试试用Levenshtein距离的相似度搜索引擎呢?您最多可以允许k次插入或删除。通过这种方式,你可以将距离函数更改为其他更适合特定问题的函数。simMetrics库中有许多可用的函数。