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

以下是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

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


当前回答

(服饰)+ (dasta) + \”?(得到)+ \ ' ?

在部分:

黑GQK铝 黑ahu铝+。 黑dtez铝+。 \”? 黑adhz铝+。 f那1,2 (i | y)

注:只是想试一试。

其他回答

使用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))

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

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

还有什么是以Q, G或K开头,中间有d, z或t,并以人们实际搜索的“fi”结尾的呢?

/\b[GQK].+[dzt].+fi\b/i

完成了。

>>> print re.search(a, "Gadasadasfiasdas") != None
False
>>> print re.search(a, "Gadasadasfi") != None
True
>>> print re.search(a, "Qa'dafi") != None
True

有趣的是,我被否决了。有人能在评论里留下一些假阳性吗?

如果你有一个包含30种可能性的具体清单,那就用一堆“or”把它们连在一起。然后你可以确保它只匹配你列出的东西,而不是更多。你的RE引擎可能会进一步优化,而且,好吧,有30个选择,即使它没有,它仍然不是一个大问题。试图手动将其转换为“聪明的”RE不可能得到更好的结果,结果可能更糟。

如果你想避免匹配没有人使用过的东西(即避免倾向于“。+”),你最好的方法是创建一个正则表达式,它只是所有的替代方案(例如。(Qadafi|Kadafi|…))然后将其编译为DFA,然后将DFA转换回正则表达式。假设一个适度合理的实现会给您一个“压缩”正则表达式,它保证不包含意外的变量。