ガダフィを検索する正規表現


361

ガダフィという単語を検索しようとしています。これを検索するのに最適な正規表現は何ですか?

これまでの私の最善の試みは:

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

しかし、私はまだいくつかのジャーナルが欠けているようです。助言がありますか?

更新:ここにかなり広範なリストを見つけました:http : //blogs.abcnews.com/theworldnewser/2009/09/how-many-different-ways-can-you-spell-gaddafi.html

以下の答えは、30のバリアントすべてに一致します。

ガダフィ
カダフィ
ガダフィ
カダフィ
ガダフィ
カダフィ
カダフィ
ガタフィ
ガダフィ
ガダフィ
ガダフィ
ガダフィ
ゲダフィ
カダフィ
カダフィ
カダフィ
カダフィ
カザフィ
カダフィ
カダフィ
カダフィ
カダフィ
カダフィ
カダフィ
カダフィ
カダフィ
カサフィ
Quathafi
クダフィ
カダフィ

8
どれが欠けていますか?そして、どこで検索していますか、正規表現によるウェブ検索はありますか?
チェコ語2011年

43
常に新しいジャーナルが発行されているため、ガダフィについて書き続ける.+と、唯一の有効な正規表現になる傾向があります。
モイヌディン

30
:私はこの絵が違うスペルに役立つことがわかっupload.wikimedia.org/math/6/1/f/...
KLee1

24
いつものように、Lispが最初にこれを実装しました-foldr.org/~michaelw/projects/regex/regexp-test-suite.lisp(半分ほど下にスクロール)
Daniel S. Sterling

7
@Daniel Sterling:実際、Khadafyテストは、RCSへの最初のコミット(Tue Nov 3 21:38:52 1998 +0000)以降のGNU grepテストスイートの一部であり、おそらくそれよりも古いものです!
Paolo Bonzini、2011

回答:


138

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

アラビア語の文字起こしは(ウィキによると)「Qaḏḏāfī」なので、おそらくQを追加します。1つのH(記事(下記を参照)で言及されているように、「Gadhafi」)。

ところで、なぜ$正規表現の最後にaがあるのですか?


ところで、このトピックに関する素晴らしい記事:

カダフィ、カダフィ、カダフィ?なぜリビアの指導者の名前はそれほど多くの異なる方法で綴られているのですか?


編集

後で言及した記事のすべての名前に一致させるには、これがすべてに一致する必要があります。それが他の多くのものと一致しないことを願いましょう:D

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

$が間違っています。最初に行末を照合していましたが、削除するのを忘れていました。
SiggyF 2011年

dもDに一致しますか?
SiggyF 2011年

2
@DiggyF、いいえ、アラビア語の転写が言うQaḏḏāfīなら、正規表現Qaddafiもチェックするべきだと思いました。アラビア語の文字起こしも検索したい場合は、その文字を検索してください。アラビア語の文字起こしには、英語の文字起こし以外のバリエーションはないと思います。
チェコ語2011年

@DiggyF、私はあなたが投稿した記事のすべての名前と一致するより長い正規表現で編集しました(?文字ではなく2つを除く)。しかし、やり過ぎかもしれません。
チェコ語2011年

2
これは、「Quuzzafi」やその他の誤検知にも一致しますが、ニュースレポートなどを検索する場合はそれほど重要ではないと思います。
ben w

275

簡単... (Qadaffi|Khadafy|Qadafi|... )...自己文書化され、保守可能であり、正規表現エンジンが実際に正規表現をコンパイルする(それらを解釈するのではなく)と想定すると、難読化されたソリューションと同じDFAにコンパイルされます。

コンパクトな正規表現の記述は、短い変数名を使用してプログラムを高速化するようなものです。コンパイラが頭の痛い場合にのみ役立ちます。


23
正解です。人々は正規表現を実際にどのように機能するかを気にするよりもずっと頻繁に使用します。
Thomas

3
このソリューションの単純さも本当に気に入っていますが、同じDFAにコンパイルできることに驚いています。これについて話すリンクはありますか?これは直感的には、以前に作成された正規表現またはordされた名前の同じリストでRegexp :: Assemble perlモジュールを使用することを示唆する以下の回答よりも効率的ではないようです。
リアンサンダーソン2011

6
-1正規表現の全体のポイントは、この場合のように、比較的短い式の代替の非常に長いリストである可能性があるものを減らすことです。多くの場合、結果は、本質的に最適化されていない網羅的な検索よりも速く実行できます。
martineau

7
そうです、正規表現のポイントは、大量の値のセットに対してコンパクトで明確な表現を提供することです。しかし、基本的な概念は、正規表現を提示し、「これに一致するものはすべて良い」と言うことです。つまり、体系的なものを含める自由があることを前提としています。ここでは、反対の状況があります。バリアントスペル(および表示されないバリエーション)は、「まったくランダム」のほんのわずかな側にすぎません。「コンパクト」での精巧な試みは「クリア」で非常に低いポイントを獲得します!
jackr

1
:また、同時に文字列検索のための最適なエイホ-コラシック法、チェックアウトen.wikipedia.org/wiki/...
トーマスAhle

45

潜在的なスペルのリストから注意すべき1つの興味深いことは、含まれているリストには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

8
これは事実ですが、ここでは奇妙な状況にあります。主なリクエストは「ガダフィという単語を検索しようとしている」ですが、正規表現は赤いニシンだと感じました。アラビア語->ラテン語の文字変換に関するルールブックはないため、リストから正規表現を元に戻すと、元の要求に完全には応答しません。
tomwalsham

2
あいまい一致システムの方が適していると思いますが、カスタムアルゴリズムはやり過ぎのようです。soundex-metaphoneコンボを使用すると、正規表現のソリューションと同じように機能し、既成のアルゴを使用したまま、さらに予期しないスペルを可能にします。
tomwalsham 2011年

metaphone2とmetaphone3を使用すると、より良い結果が得られます(つまり、metaphone2のほとんどすべてがKDFですが、metaphone1はそうではありません)。ただし、Metaphone3の価格は約40ドルです。
シークレット

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

23

ここであなたは物事を複雑にしています。正しい正規表現は次のように簡単です。

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

これは、القذافي(ガダフィ)などの単語を形成する7つのアラビア語Unicodeコードポイントの連結に一致します。


3
次に、nytimes.comをGoogle翻訳にパイプするだけで、ボブはあなたの叔父です。
Robert Rossney、2011

19

誰も使用していないものとの一致を避けたい場合(つまり、「。+」の傾向を避けたい場合)の最善の方法は、すべての代替手段である正規表現を作成することです(たとえば(Qadafi | Kadafi | ...) )次に、それをDFAにコンパイルし、DFAを正規表現に変換します。予想外のバリアントを含まないことが保証されている「圧縮された」正規表現を提供する、適度に賢明な実装を想定しています。


2
私はそれが理論的に可能であることを知っていますが、実際にそれをどのように実行しますか(たとえば、som共通動的言語を使用)
Rory

3
私はこれの背後にある理論を理解していますが、@ Roryと同様に、実際にこれを実際にどのように行うかについても知りたいです。
dancavallaro

ええ、私はより良い答えを出すためにそれをすることを考えましたが、私は現在少し忙しいです。私は、いくつかの(醜いと不十分な文書化)コード持ってcode.google.com/p/lepl/source/browse/src/lepl/regexp/core.py正規表現からDFAを構築する(実際には、パーサは別のクラスであるが、しかしハードワークはそこにあります;あなたは正規表現-> nfa-> dfaに行きます)。dfaから正規表現への移行は簡単です(私はそう思いますか?)。
アンドリュークック

実際、私が覚えているよりもドキュメントが優れています:o)基本的な考え方は、ファイルの先頭近くのクラスの観点から正規表現を記述することです。これはかなり簡単にnfaに変換できます(nfaは実際には、「ここまたはここに行くことができるよりもこの手紙を受け取った場合」と言う遷移のセットにすぎません。その場合、dfaは一種の「拡張」バージョンであり、バックトラックする必要がありません。これはNfaToDfaによって行われます(そして難しい部分です)。DFAは、非常に複雑な文字セット(?!)と書かれています正規表現自体としてのけれどもすることができ
アンドリュー・クック

10

30の可能性すべての具体的なリストがある場合は、それらを「or」の束でまとめて連結します。そうすれば、リストしたものと正確に一致するだけで、それ以上は一致しないことを確認できます。あなたのREエンジンはおそらくさらに最適化することができ、そうでない場合でも30の選択肢がありますが、それはまだ大したことではありません。手動でそれを「賢い」REに変えることでいじくり回そうとすることは、おそらくうまくいかず、悪くなるかもしれません。


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)

確かに最も最適化されたバージョンではありません。誤検出がないことを確認しながら、一致を最大化するために音節で分割します。




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でご覧ください


あなた\bは最初と最後の選択肢にのみ含まれています。
Christopher Creutzig、2011

1

これは古い質問であることは知っていますが、...

これら2つの正規表現はどちらもきれいではありませんが、最適化されており、どちらも元の投稿のすべてのバリエーションに一致します。

「小さな美しさ」#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

安らかに眠れ、ムアンマル。



0

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

部分的に:

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

注:これを試してみたかっただけです。


-1

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 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 。ただし、それらのいくつかは検知ではありません。
BMDan 2011

2
そして、そのリストへの追加という結果に終わるから[iy]だけではなく、のigelatinify gentrify ghostlify giddify gladify goutify gratify "Gyula Dessewffy" katasrofy katastrofy khadafy quantify quasi-deify quizzify
BMDan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.