2011-03-19 149 views
352

我正在嘗試搜索單詞Gadaffi。什麼是最好的正則表達式來尋找這個?正則表達式搜索Gadaffi

我最好的嘗試,到目前爲止是:

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

但我似乎仍然缺少一些期刊。有什麼建議麼?

更新:我發現了一個非常廣泛的名單在這裏:http://blogs.abcnews.com/theworldnewser/2009/09/how-many-different-ways-can-you-spell-gaddafi.html

答案下面匹配的所有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 
+2

你怎麼知道你錯過了一些期刊? – heldt 2011-03-19 22:15:39

+8

你錯過了哪些?你在哪裏搜索,是否有正則表達式的網絡搜索? – Czechnology 2011-03-19 22:15:46

+1

每次我讀新的日記時,都會發現新的拼寫。例如紐約時報使用卡扎菲。 – SiggyF 2011-03-19 22:19:30

回答

137

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

阿拉伯語轉錄(維基說) 「卡扎菲」 ,所以也許增加一個Q.和一個H(「Gadhafi」,如文章(見下文)提到)。

順便說一句,爲什麼在正則表達式的末尾有$


順便說一句,題目是好文章:

Gaddafi, Kadafi, or Qaddafi? Why is the Libyan leader’s name spelled so many different ways?


編輯

要在article you've mentioned later匹配所有的名字,這應該與他們所有人。我們只是希望它不會匹配了很多其他的東西:(「+」,即避免對撫育)如果你想避免匹配,沒有人已經用過的東西d

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

$是錯誤的,我先匹配行尾,忘記刪除它。 – SiggyF 2011-03-19 22:23:14

+0

'd'也匹配ḏ嗎? – SiggyF 2011-03-19 22:30:17

+2

@DiggyF,不,我只是想,如果阿拉伯語的轉錄說'Qaḏḏāfī',正則表達式也應該檢查'Qaddafi'。如果你也想尋找阿拉伯語的轉錄,只需要搜索那個 - 我不認爲阿拉伯語轉錄有更多的變種,只有英文轉錄。 – Czechnology 2011-03-19 22:34:06

19

你最好的辦法是創建一個正則表達式,這就是所有的選擇(例如。(Qadafi | Kadafi | ...))然後將其編譯到DFA,然後將DFA轉換回正則表達式。假設一個適度合理的實現將會給你一個「壓縮的」正則表達式,保證不包含意外的變體。

+2

我知道這是可能的,但你會如何做到這一點(例如使用索姆通用動態語言) – Rory 2011-03-21 15:55:08

+3

我理解這個背後的理論,但是像@Rory一樣,我也很想知道你在實踐中是如何做到這一點的。 – dancavallaro 2011-03-21 16:54:41

+0

是的,我想這樣做,給出更好的答案,但我現在有點忙。我在http://code.google.com/p/lepl/source/browse/src/lepl/regexp/core.py中有一些(醜陋且文檔記錄不完整的)代碼,它從正則表達式構造dfa(實際上,解析器是在另一個班級,但努力工作在那裏;你去正則表達式 - > nfa - > dfa)。從dfa到正則表達式很容易(我認爲?)。 – 2011-03-22 00:29:37

10

如果你已經具備了所有30種可能性的具體列表,只需將它們連同一堆「ors」連接起來即可。那麼你可以當然它只匹配你列出的確切的東西,沒有更多。您的可再生能源發動機可能會進一步優化,並且,即使它不是一個大問題,也可以有30個選擇。試圖用手動把它變成一個「聰明」的可再生能源不可能變得更好,可能會變得更糟。

0

只是一個附錄:你應該添加「格達菲」作爲替代拼寫。因此,RE應

\b[KG]h?[ae]dd?af?fi$\b 
9
(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) 

肯定不是最優化的版本,音節拆分,同時努力確保我們沒有得到誤報最大化匹配。從你的潛在拼寫的名單要注意

45

一個有趣的事情是,有隻有3所包含的列表SOUNDEX值(如果你忽略了離羣「Kazzafi」)

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; 
?> 

一些調整,可以說一些西里爾語音譯,你會有一個相當強大的解決方案。

+2

請注意,soundex專門用於英語,其他語言的發音規則確實存在其他語音算法 – Incognito 2011-03-21 18:01:46

+8

雖然這是真的,我們在這裏處於一種奇怪的狀況。主要要求是「我試圖搜索Gadaffi」這個詞,但我覺得這個正則表達式是一個紅鯡魚。關於阿拉伯語 - >拉丁語音譯沒有規則手冊,因此,從列表中反轉正則表達式不會完全回答原始請求。 – tomwalsham 2011-03-21 18:19:42

+2

我覺得模糊匹配系統更適合,但自定義算法看起來過度。使用soundex-metaphone組合似乎表現得和正則表達式解決方案一樣好,可以進一步發生意想不到的拼寫,同時還可以使用現成的算法。 – tomwalsham 2011-03-21 18:26:02

269

容易... (Qadaffi|Khadafy|Qadafi| ... ) ......這是自我記錄,維護,並假設你的正則表達式引擎實際上編譯正則表達式(而不是將它們解釋),它將編譯到同一個DFA是一個更模糊解決方案會。

編寫緊湊正則表達式就像使用短變量名稱來加速程序。它只會幫助你的編譯器死腦筋。

+23

很好的答案!人們使用正則表達式的次數遠遠超過他們關心的實際工作方式。 – 2011-03-28 14:29:20

+3

我真的很喜歡這個解決方案的簡單性,但我很驚訝這會編譯到同一個DFA。你有鏈接,談論這個?直觀地說,這看起來可能比先前製作的正則表達式效率低,或者下面的答案建議在相同的or'd名稱列表中使用Regexp :: Assemble perl模塊。 – 2011-08-25 00:08:05

+6

-1正則表達式的全部意義在於減少通常可能的情況 - 就像在這種情況下 - 是一個很短的公式替代方案的很長的列表。結果往往比執行本質上未優化的窮舉搜索更快。 – martineau 2011-08-25 15:50:57

23

我覺得你在這裏複雜化了。正確的正則表達式是簡單:

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

它形成字القذافي(即卡扎菲)的七個阿拉伯Unicode代碼點的串聯匹配。

+3

接下來,只需通過谷歌翻譯管道nytimes.com和鮑勃的你的叔叔。 – 2011-08-24 06:33:53

6

那麼既然你是匹配小字你爲什麼不嘗試similarity search engineLevenshtein距離?您最多可以允許插入或刪除。通過這種方式,您可以將距離函數更改爲其他更適合您的特定問題的工具。 simMetrics庫中提供了許多功能。

1

爲什麼不做一個混合的方法?列表中的所有可能性和複雜的正則表達式匹配太多。

正則表達式是關於模式匹配的,我看不到列表中所有變體的模式。試圖這樣做,也會發現諸如「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

+0

您的'\ b'只包含在第一個和最後一個選項中。 – 2011-08-24 06:13:25

+0

@Christopher Creutzig當然你是對的,糾正。 – stema 2011-08-24 17:27:18

27

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

否則爲Q,G,或K開始什麼,中間有ad,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 

有趣的是,我得到了低估。有人可以在評論中留下一些誤報嗎?

+2

從破解字典,我碰巧坐在一旁:'kartografi kryptografi 卡扎菲 卡扎菲 gadafi 卡扎菲 katastloofi katastorfi katastrofi khadaffi 卡達菲 kardiyografi gaskromatografi kardiografi kinematografi kromatografi krystallografi kulturgeografi gandolfi grizzaffi gadhafi kad阿菲 kaddafi khaddafi 卡扎菲卡扎菲 quedaffi gordonsCHsKFI '。儘管如此,其中一些不是*虛假*積極的。 – BMDan 2011-08-27 22:01:59

+2

這從'[IY]',而不是僅僅'i'結束產生的附加到該列表:'gelatinify gentrify ghostlify giddify gladify goutify 放縱 「久拉Dessewffy」 katasrofy katastrofy khadafy Quantify的 準deify quizzify ' – BMDan 2011-08-27 22:04:21

1

我知道這是一個老問題,但...

無論這兩個正則表達式是最漂亮的,但他們是最優的,都匹配ALL在原崗位的變化。

「小美人」 #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 

安息,卡扎菲。