正则expression式来searchGadaffi

我正在寻找Gadaffi这个词。 什么是最好的正则expression式来寻找这个?

我迄今为止的最佳尝试是:

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

但是我似乎还缺less一些期刊。 有什么build议么?

更新:我在这里find一个相当广泛的列表: http : //blogs.abcnews.com/theworldnewser/2009/09/how-many-different-ways-can-you-spell-gaddafi.html

下面的答案匹配所有30个变种:

卡扎菲
 Gadafi
 Gadafy
卡扎菲
 Gaddafy
 Gaddhafi
卡扎菲
 Gathafi
 Ghadaffi
卡扎菲
卡扎菲
 Ghaddafy
 Gheddafi
 Kadaffi
卡达菲
 Kaddafi
卡扎菲
 Kazzafi
 Khadaffy
 Khadafy
 Khaddafi
 Qadafi
卡扎菲
卡扎菲
 Qadhdhafi
 Qadthafi
卡扎菲
 Quathafi
 Qudhafi
 Kad'afi

\b[KGQ]h?add?h?af?fi\b

阿拉伯语的转录是(维基说)“Qaḏḏāfī”,所以也许增加一个Q.和一个H(“卡扎菲”,如下文所述)。

顺便说一句,为什么在正则expression式的末尾有一个$


顺便说一句,好主题的文章:

卡扎菲,卡达菲还是卡扎菲? 为什么利比亚领导人的名字拼写了很多不同的方式? 。


编辑

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

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

简单… (Qadaffi|Khadafy|Qadafi|) …它是自我logging,可维护的,并假设你的正则expression式引擎实际上编译正则expression式(而不是解释它们),它会编译到相同的DFA,更混乱的解决scheme会。

编写简洁的正则expression式就像使用简短的variables名来加速程序一样。 它只有在你的编译器死脑筋时才有用。

从您的潜在拼写列表中,有一件有趣的事情是,包含列表中只有3个Soundex值(如果忽略“Kazzafi”exception值)

G310,K310,Q310

现在,在那里有误报(“Godby”也是G310),但通过结合有限的metaphone命中,你可以消除它们。

 <? $soundexMatch = array('G310','K310','Q310'); $metaphoneMatch = array('KTF','KTHF','FTF','KHTF','K0F'); $text = "This is a big glob of text about Mr. Gaddafi. Even using compound-Khadafy terms in here, then we might find Mr Qudhafi to be matched fairly well. For example even with apostrophes sprinkled randomly like in Kad'afi, you won't find false positives matched like godfrey, or godby, or even kabbadi"; $wordArray = preg_split('/[\s,.;-]+/',$text); foreach ($wordArray as $item){ $rate = in_array(soundex($item),$soundexMatch) + in_array(metaphone($item),$metaphoneMatch); if ($rate > 1){ $matches[] = $item; } } $pattern = implode("|",$matches); $text = preg_replace("/($pattern)/","<b>$1</b>",$text); echo $text; ?> 

一些调整,可以说一些西里尔文音译,你会有一个相当强大的解决scheme。

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

这会产生以下正则expression式:

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

我认为你在这里复杂的事情。 正确的正则expression式就像下面这样简单:

 \u0627\u0644\u0642\u0630\u0627\u0641\u064a 

它匹配形成单词القذافي(即Gadaffi)的七个阿拉伯语Unicode代码点的连接。

如果你想避免匹配没有人使用的东西(即避免趋向于“+”),你最好的办法是创build一个正则expression式,只是所有的select(例如(Qadafi | Kadafi | …) )然后将其编译到DFA,然后将DFA转换回正则expression式。 假设一个适度的明智的实现,会给你一个“压缩的”正则expression式,保证不包含意外的变体。

如果你已经得到了所有30种可能性的具体列表,只需要把它们连在一起,就可以连成一堆“ors”。 那么你可以确定 ,它只匹配你列出的确切的东西,而不是更多。 你的可再生能源发动机可能会进一步优化,而且,即使它不是一个大问题,也可以有30个select。 试图手动把它变成一个“聪明的”可再生能源不可能变得更好,可能会变得更糟。

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

当然不是最优化的版本,在音节上分割以最大化匹配,同时确保我们不会误报。

那么既然你匹配小字为什么不尝试一个与Levenshtein距离相似的search引擎 ? 您最多可以允许k个插入或删除。 通过这种方式,您可以将距离函数更改为其他更适合您的特定问题的工具。 simMetrics库中有许多可用的function。

一个可能的select是从在线工具生成来自示例http://regex.inginf.units.it的正则expression式。; 给它一个机会!

为什么不做一个混合的方法? 列表之间的所有可能性和一个复杂的正则expression式匹配太多。

正则expression式是关于模式匹配的,我看不到列表中所有变体的模式。 试图这样做,也会发现诸如“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上查看

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

这两个正则expression式都不是最漂亮的,但是它们被优化,并且都匹配原始文章中的所有变体。

“小美人”#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 

安息,穆阿马尔。

只是一个附录:你应该添加“格达”作为替代拼写。 所以RE应该是

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

Q,G或K开头的是什么,中间是ad,z或t,结尾是人们实际search的“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 

有趣的是我得到了低估。 有人可以在评论中留下一些误报吗?