Gadaffi'yi aramak için düzenli ifade


361

Gadaffi kelimesini aramaya çalışıyorum. Bunu aramak için en iyi normal ifade nedir?

Şimdiye kadar yaptığım en iyi girişim:

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

Ama hala bazı dergiler eksik gibi görünüyor. Herhangi bir öneri?

Güncelleme: Burada oldukça kapsamlı bir liste buldum: http://blogs.abcnews.com/theworldnewser/2009/09/how-many-different-ways-can-you-spell-gaddafi.html

Aşağıdaki cevap 30 değişkenin hepsiyle eşleşiyor:

Kaddafi
Gadafi
Gadafy
Kaddafi
Gaddafy
Gaddhafi
Kaddafi
Gathafi
Ghadaffi
Ghadafi
Kaddafi
Ghaddafy
Gheddafi
Kadaffi
Kadafi
Kaddafi'nin
Kaddafi
Kazzafi
Khadaffy
Khadafy
Khaddafi
Qadafi
Kaddafi
Kaddafi
Qadhdhafi
Qadthafi
Qathafi
Quathafi
Qudhafi
Kad'afi

8
Hangilerini kaçırıyorsun? Peki nerede arıyorsunuz, normal ifade ile bir web araması var mı?
Mart'ta Çek Teknolojisi

43
Her zaman yeni dergiler yayınlanır, bu yüzden Gadaffi hakkında yazmaya devam ederlerse .+, tek geçerli düzenli ifade olmaya eğilimlersiniz .
moinudin

30
Bu resmin farklı yazımlara yardımcı olduğunu buldum: upload.wikimedia.org/math/6/1/f/…
KLee1

24
Her zamanki gibi, Lisp bunu ilk olarak uyguladı - foldr.org/~michaelw/projects/regex/regexp-test-suite.lisp (yarım yol aşağı kaydırın)
Daniel S. Sterling

7
@Daniel Sterling: Aslında, Khadafy testi, RCS'ye ilk taahhütten bu yana GNU grep testsuite'nin bir parçasıdır (Sal 3 Kasım 21:38:52 1998 +0000) ve muhtemelen bundan daha da eskidir!
Paolo Bonzini

Yanıtlar:


138

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

Arapça transkripsiyon (Wiki diyor) "Qaḏḏāfī", bu yüzden belki bir Q ve bir H ("Gadhafi", makalede belirtildiği gibi) eklemek.

Btw, neden $normal ifadenin sonunda bir var ?


Btw, konuyla ilgili güzel bir makale:

Kaddafi mi, Kadafi mi, Kaddafi mi? Libya liderinin adı neden bu kadar farklı yolla yazılmıştır? .


DÜZENLE

Daha sonra bahsettiğiniz makaledeki tüm adları eşleştirmek için, bunların hepsiyle eşleşmesi gerekir. Umarım başka birçok şeyle eşleşmez: D

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

$ Yanlış, ben ilk satır sonu eşleşen, kaldırmayı unuttum.
SiggyF

Does dayrıca D maç?
SiggyF

2
@DiggyF, hayır, sadece Arapça transkripsiyon diyorsa Qaḏḏāfī, normal ifadenin de kontrol etmesi gerektiğini düşündüm Qaddafi. Arapça transkripsiyonu da aramak istiyorsanız, sadece onu arayın - Arapça transkripsiyonun daha fazla varyantı olduğunu düşünmüyorum, sadece İngilizce transkripsiyonlar.
Mart'ta Çek Teknolojisi

@DiggyF, yayınladığınız makaledeki tüm isimlerle eşleşen daha uzun bir normal ifadeyle düzenledim ?(harfler yerine ikisi hariç ). Gerçi abartılı olabilir.
Mart'ta Çek Teknolojisi

2
Bu, 'Quuzzafi' ve bir dizi yanlış pozitifle de eşleşiyor, ancak haber raporları vb.
ben w

275

Kolay ... (Qadaffi|Khadafy|Qadafi|... )... kendi kendini belgeleyen, bakımı kolay ve regexp motorunuzun aslında düzenli ifadeleri (bunları yorumlamak yerine) derlediğini varsayarsak, daha gizli bir çözümle aynı DFA'ya derlenir.

Kompakt düzenli ifadeler yazmak, bir programı hızlandırmak için kısa değişken adları kullanmak gibidir. Sadece derleyiciniz beyin ölü ise yardımcı olur.


23
Mükemmel cevap! İnsanlar normal ifadeleri gerçekte nasıl çalıştıklarına aldıklarından çok daha sık kullanırlar.
Thomas Ahle

3
Bu çözümün basitliğini de çok seviyorum, ancak bunun aynı DFA'ya kadar derleneceğine şaşırdım. Bununla ilgili bir bağlantınız var mı? Sezgisel olarak bu, daha önce hazırlanmış normal ifadeden veya aşağıdaki yanıttan daha az verimli gibi görünebilir; bu, aynı ad veya ad adları listesinde Regexp :: Assemble perl modülünü kullanmanızı önerir.
Rian Sanderson

6
-1 Normal ifadenin bütün amacı, bu durumda olduğu gibi - nispeten kısa formüle alternatiflerin çok uzun bir listesini sık sık ne olabileceğini azaltmaktır. Sonuç genellikle optimize edilmemiş kapsamlı bir arama yapmaktan daha hızlı gerçekleştirilebilir.
martineau

7
Haklısın, normal ifadelerin amacı büyük bir değer kümesi için kompakt ve net bir sunum sağlamaktır. Ancak temel kavram bir normal ifade sunmak ve "buna uyan her şey iyidir" demek. Yani, sistematik herhangi bir şeyi dahil etme özgürlüğünüz olduğunu varsayar. Burada karşıt bir durumumuz var: varyant yazımlar (ve asla ortaya çıkmayan varyasyonlar) 'tamamen rasgele'nin sadece bu tarafıdır. "Kompakt" olan ayrıntılı girişimler "açık" için çok düşük puanlar alır!
jackr

1
Ayrıca, aynı anda dizi arama için en uygun olan Aho-Corasick algoritmasına da göz atın: en.wikipedia.org/wiki/…
Thomas Ahle

45

Potansiyel yazım listenizden not edilmesi gereken ilginç bir şey, içerilen liste için sadece 3 Soundex değerinin olmasıdır (aykırı 'Kazzafi' 'yi yoksayarsanız)

G310, K310, Q310

Şimdi, orada yanlış pozitifler var ('Godby' de G310), ancak sınırlı metafon hitlerini birleştirerek bunları ortadan kaldırabilirsiniz.

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

Birkaç ince ayar ve biraz kiril harf çevirisi diyelim ve oldukça sağlam bir çözümünüz olacak.


2
Soundex İngilizce konusunda uzmanlaşmıştır, farklı telaffuz kurallarına sahip diğer diller için başka fonetik algoritmalar vardır
Incognito

8
Bu doğru olsa da, burada tuhaf bir durumdayız. Birincil talep "Gadaffi kelimesini aramaya çalışıyorum" idi, ama normal ifadenin kırmızı bir ringa balığı olduğunu hissediyorum. Arapça-> latin harf çevirisi ile ilgili bir kural kitabı yoktur ve bu nedenle bir listeden normal ifadeyi tersine çevirmek orijinal talebe tam olarak cevap vermeyecektir.
tomwalsham

2
Bulanık bir eşleme sisteminin daha uygun olduğunu hissediyorum, ancak özel bir algoritma aşırıya kaçmış gibi görünüyor. Soundex-metaphone combo kullanımı, normal kullanıma hazır algos kullanırken hala beklenmedik yazımlara izin veren normal ifade çözümünün yanı sıra performans sergiliyor gibi görünüyor.
tomwalsham

Metaphone2 ve metaphone3 kullanımı daha iyi sonuçlara yol açar (yani, metaphone2'daki hemen hemen her şey metafon1 gibi pek de değil KDF'dir). Ancak Metaphone3'ün fiyatı yaklaşık 40 dolar.
Gizli

27

CPAN modülünü kullanma Regexp :: Birleştir :

#!/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;

Bu, aşağıdaki normal ifadeyi üretir:

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

23

Sanırım burada işleri karmaşıklaştırıyorsunuz. Doğru normal ifade şöyle basit:

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

القذافي (yani Gadaffi) sözcüğünü oluşturan yedi Arapça Unicode kod noktasının birleşmesiyle eşleşir.


3
Daha sonra, nytimes.com'u Google Translate ile paylaşın ve Bob amcanız.
Robert Rossney

19

Hiç kimsenin kullanmadığı şeylerle eşleşmekten kaçınmak istiyorsanız (yani ". +" Yönüne doğru ilerlemekten kaçının) en iyi yaklaşımınız tüm alternatifleri içeren düzenli bir ifade oluşturmak olacaktır (örn. (Qadafi | Kadafi | ...) ) daha sonra bunu bir DFA'ya derleyin ve ardından DFA'yı normal ifadeye dönüştürün. Beklenmedik varyantlar içermediğini garanti eden "sıkıştırılmış" bir düzenli ifade verecek orta derecede mantıklı bir uygulama olduğunu varsayarsak.


2
Bunun mümkün olduğunu biliyorum, ama bunu pratikte nasıl yapardınız (örneğin, ortak bir dinamik dil kullanarak)
Rory

3
Bunun arkasındaki teoriyi anlıyorum, ama @Rory gibi, bunu aslında pratikte nasıl yapacağınızı bilmek istiyorum.
dancavallaro

Evet, daha iyi bir cevap vermek için yapmayı düşündüm, ama şu anda biraz meşgulüm. code.google.com/p/lepl/source/browse/src/lepl/regexp/core.py bazı (çirkin ve kötü belgelenmiş) kodu var regexp bir dfa (aslında, ayrıştırıcı başka bir sınıfta) , ama zor iş orada; git regexp -> nfa -> dfa). dfa regexp için gitmek kolaydır (sanırım?).
andrew cooke

aslında, orada belgelere hatırlamıyorum daha iyidir: o) temel fikir regexp dosyanın üstündeki sınıflar açısından tarif olmasıdır. o zaman bir nfa'ya kolayca çevrilebilir (nfa gerçekten sadece "bu mektubu buraya veya buraya gidebileceğinden daha fazla alırsan ..." demek oldukça kolay bir geçişler dizisidir). dfa o zaman bir tür "genişletilmiş" versiyonu burada geri izlemek zorunda kalmamak; bu NfaToDfa tarafından yapılır (ve zor kısmıdır). dfa daha sonra çok karmaşık karakter setleri (?!) olarak yazılan bir regexp kendisi gibi olabilir
andrew cooke

10

30 olasılığın da somut bir listesine sahipseniz, hepsini bir grup "ors" ile birleştirin. Ardından, yalnızca listelediğiniz şeylerle eşleştiğinden ve daha fazla olmadığından emin olabilirsiniz . RE motorunuz muhtemelen daha da optimize edebilecek ve iyi olmasa bile 30 seçenekle iyi bir şekilde optimize edebilecek. Manuel olarak "akıllı" bir RE'ye dönüştürerek uğraşmaya çalışmak muhtemelen daha iyi olamaz ve daha kötü sonuç verebilir.


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)

Kesinlikle en iyileştirilmiş sürüm değil, yanlış pozitif almadığımızdan emin olmak için eşleşmeleri en üst düzeye çıkarmak için hecelere bölün.


7

Küçük kelimeleri eşleştirdiğiniz için neden Levenshtein ile benzerlik arama motoru denemiyorsunuz? mesafeye? En fazla k eklemeye veya silmeye izin verebilirsiniz . Bu şekilde, mesafe işlevini, sorununuz için daha iyi çalışan diğer şeylerle değiştirebilirsiniz. SimMetrics kitaplığında birçok işlev vardır.



1

Neden karışık bir yaklaşım yapmıyorsunuz? Tüm olasılıkların bir listesi ile çok fazla eşleşen karmaşık bir Regex arasında bir şey.

Regex kalıp eşleştirme ile ilgilidir ve listedeki tüm varyantlar için bir kalıp göremiyorum. Bunu yapmaya çalıştığınızda, büyük olasılıkla kullanılmış bir varyant olmayan ve kesinlikle listede olmayan "Gazzafy" veya "Quud'haffi" gibi şeyler de bulacaksınız.

Ama bazı varyantlar için kalıpları görebiliyorum ve böylece bununla sonuçlandım:

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

Başlangıçta bir deseni göremediğimleri listeliyorum, ardından desenlerin olduğu bazı varyantları takip ediyorum.

Www.rubular.com burada görmek


Sizin \bsadece ilk ve son alternatifleri dahildir.
Christopher Creutzig

1

Bunun eski bir soru olduğunu biliyorum, ama ...

Bu iki regex'in hiçbiri en güzel değil, ancak optimize edildi ve her ikisi de orijinal yayındaki TÜM varyasyonlarla eşleşti .

"Küçük Güzellik" # 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)

"Küçük Güzellik" # 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

Huzur içinde yat, Muammer.


0

Sadece bir zeyilname: "Gheddafi" yi alternatif yazım olarak eklemelisiniz. Yani RE olmalı

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

0

[GQK] [ahu] + [dtez] + \ '[adhz] + f {1,2}, (i | y)?

Parçalarda:

  • [GQK]
  • [Ahu] +
  • [Dtez] +
  • \ '?
  • [Adhz] +
  • f {1,2}, (i | y)

Not: Sadece buna bir şans vermek istedim.


-1

Başka ne Q, G veya K ile başlar, ortasında reklam, z veya t vardır ve insanların gerçekten aradığı "fi" ile biter ?

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

Bitti.

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

İlginç olan aşağı düşmem. Birisi yorumlarda yanlış pozitifler bırakabilir mi?


2
Ben gerçekleştiğini bir çatlama sözlükten oturup için: kartografi kryptografi Gaddafi Qaddafi gadafi gaddafi katastloofi katastorfi katastrofi khadaffi kadafi kardiyografi gaskromatografi kardiografi kinematografi kromatografi krystallografi kulturgeografi gandolfi grizzaffi gadhafi kadaffi kaddafi khaddafi qaddafi qadhafi quedaffi gordonsCHsKFI . Ancak bunlardan bazıları yanlış pozitif değil .
BMDan

2
Ve bu listeye [iy]sadece bunun yerine biten sonuçlardan kaynaklanan igelatinify gentrify ghostlify giddify gladify goutify gratify "Gyula Dessewffy" katasrofy katastrofy khadafy quantify quasi-deify quizzify
eklemeler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.