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

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

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


当前回答

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

其他回答

我知道这是个老问题,但是…

这两个正则表达式都不是最漂亮的,但它们都经过优化,并且都匹配原始帖子中的所有变体。

“小美人”#1

(?: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)

《小美人》2

(?:(?:Gh|[GK])adaff|(?:(?:Gh|[GKQ])ad|(?:Ghe|(?:[GK]h|[GKQ])a)dd|(?:Gadd|(?:[GKQ]a|Q(?:adh|u))d|(?:Qad|(?:Qu|[GQ])a)t)h|Ka(?:zz|d'))af)i|(?:Khadaff|(?:(?:Kh|G)ad|Gh?add)af)y

安息吧,穆阿迈尔。

容易……谴责卡扎菲(为了规避风险| | |……它是自文档化的、可维护的,并且假设您的regexp引擎实际上编译正则表达式(而不是解释它们),它将编译到与更模糊的解决方案相同的DFA。

编写紧凑的正则表达式就像使用短变量名来加快程序的速度。只有当你的编译器是脑死亡的时候才有用。

(G|Gh|K|Kh|Q|Qh|Q|Qu)(a|au|e|u)(dh|zz|th|d|dd)(dh|th|a|ha|)(\x27|)(a|)(ff|f)(i|y)

当然不是最优化的版本,在音节上进行分割以最大化匹配,同时试图确保我们不会得到假阳性。

还有什么是以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

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

\ [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