गदाफी की खोज के लिए नियमित अभिव्यक्ति


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 प्रकारों से मेल खाते हैं:

गद्दाफी
Gadafi
Gadafy
गद्दाफी
Gaddafy
Gaddhafi
गद्दाफी
Gathafi
Ghadaffi
Ghadafi
Ghaddafi
Ghaddafy
Gheddafi
Kadaffi
Kadafi
Kaddafi
Kadhafi
Kazzafi
Khadaffy
Khadafy
Khaddafi
Qadafi
कद्दाफी
Qadhafi
Qadhdhafi
Qadthafi
Qathafi
Quathafi
Qudhafi
Kad'afi

8
आप किन लोगों को याद कर रहे हैं? और आप कहां खोज रहे हैं, क्या रेगेक्स के साथ एक वेब-खोज है?
Czechnology

43
हमेशा नई पत्रिकाएँ प्रकाशित होती हैं, इसलिए यदि वे गदाफी के बारे में लिखते रहते हैं तो आप .+एकमात्र नियमित नियमित अभिव्यक्ति होने की ओर बढ़ेंगे ।
मोइनुद्दीन

30
मैंने पाया कि यह चित्र विभिन्न वर्तनी के साथ मदद करता है: upload.wikimedia.org/math/6/1/f/…
KLee1

24
हमेशा की तरह, लिस्प ने इसे सबसे पहले लागू किया - foldr.org/~michaelw/projects/regex/regexp-test-suite.lisp (आधा रास्ता नीचे स्क्रॉल करें)
डैनियल एस। स्टर्लिंग

7
@ डैनियल स्टर्लिंग: वास्तव में, खादी परीक्षण आरसीएस के लिए प्रारंभिक प्रतिबद्धता के बाद से GNU grep टेस्टसुइट का हिस्सा है (Tue Nov 3 21:38:52 1998 +0000), और शायद उससे भी पुराना है!
पाओलो बोन्जिनी

जवाबों:


138

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

अरबी प्रतिलेखन है (विकी कहता है) "क़ाफी", इसलिए शायद एक क्यू और एक एच ("गद्दाफी" जोड़ना, जैसा कि लेख (नीचे देखें) में उल्लेख है)।

Btw, $रेगेक्स के अंत में क्यों है ?


Btw, विषय पर अच्छा लेख:

गद्दाफी, कडाफी, या क़द्दाफ़ी? लीबिया के नेता का नाम इतने अलग-अलग तरीकों से क्यों लिखा गया है?


संपादित करें

बाद में आपके द्वारा उल्लिखित लेख के सभी नामों का मिलान करने के लिए , यह उन सभी से मेल खाना चाहिए। चलो बस आशा करते हैं कि यह बहुत सारे अन्य सामानों से मेल नहीं खाएगा: डी

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

$ गलत है, मैं पहले लाइनों के अंत का मिलान कर रहा था, इसे निकालना भूल गया।
सिग्यिफ़

है dयह भी एक डी से मेल खाते हैं?
सिग्यिफ़

2
@ डिग्गीफ, नहीं, मैंने अभी सोचा था कि अगर अरबी प्रतिलेखन कहता है Qaḏḏāfī, तो रेगेक्स को Qaddafiभी जांचना चाहिए । यदि आप अरबी प्रतिलेखन को भी देखना चाहते हैं, तो बस उस एक की खोज करें - मुझे नहीं लगता कि अरबी प्रतिलेखन के अधिक संस्करण हैं, केवल अंग्रेजी प्रतिलेखन के।
Czechnology

@ डिग्गीफ़, मैंने एक लंबे रेगेक्स में संपादन किया है जो आपके द्वारा पोस्ट किए गए लेख के सभी नामों से मेल खाता है ( ?अक्षरों के बजाय दो को छोड़कर )। हालांकि एक ओवरकिल हो सकता है।
Czechnology

2
यह 'क्वुज़ाफ़ी' और अन्य झूठी सकारात्मक चीज़ों के एक समूह से भी मेल खाता है, हालांकि मुझे लगता है कि समाचार रिपोर्टों आदि के माध्यम से खोज करने पर यह बहुत अधिक नहीं होगा।
बेन डब्ल्यू

275

आसान ... (Qadaffi|Khadafy|Qadafi|... )... यह स्व-प्रलेखित, बनाए रखने योग्य है, और आपके regexp इंजन को संभालने से वास्तव में नियमित अभिव्यक्तियों (उन्हें व्याख्या करने के बजाय) को संकलित किया जाता है, यह उसी डीएफए को संकलित करेगा जो एक अधिक संक्षिप्त समाधान होगा।

कॉम्पैक्ट रेगुलर एक्सप्रेशन लिखना किसी प्रोग्राम को गति देने के लिए छोटे चर नामों का उपयोग करने जैसा है। यह तभी मदद करता है जब आपका कंपाइलर दिमागी रूप से मृत हो।


23
बहुत बढ़िया जवाब! वास्तव में वे कैसे काम करते हैं, इसकी परवाह किए बिना लोग नियमित अभिव्यक्ति का अधिक बार उपयोग करते हैं।
थॉमस अहले

3
मैं वास्तव में इस समाधान की सादगी को भी पसंद करता हूं, लेकिन मुझे आश्चर्य है कि यह उसी डीएफए को संकलित करेगा। क्या आपके पास एक लिंक है जो इस बारे में बात करता है? सहज रूप से ऐसा लगता है कि यह पहले से तैयार किए गए रेगेक्स की तुलना में कम कुशल हो सकता है या नीचे दिए गए उत्तर जो Regexp का उपयोग करने का सुझाव देता है :: एक ही नाम या उसी नाम की सूची में पर्ल मॉड्यूल इकट्ठा करें।
रियान सैंडरसन

6
-1 रेगेक्स का पूरा बिंदु यह है कि जो अक्सर हो सकता है उसे कम करना है - जैसा कि इस मामले में है - अपेक्षाकृत छोटे फॉर्मूले के विकल्प की एक बहुत लंबी सूची। परिणाम अक्सर ऐसा करने की तुलना में तेजी से निष्पादित कर सकता है जो अनिवार्य रूप से एक बिना सोचे-समझे विस्तृत खोज है।
मार्टीन्यू

7
आप सही कह रहे हैं, कि रेगेक्स की बात मूल्यों के एक बड़े समूह के लिए एक स्पष्ट, स्पष्ट प्रतिनिधित्व प्रदान करना है। लेकिन मूल अवधारणा यह है कि रेगेक्स को प्रस्तुत किया जाए और कहा जाए कि "जो भी इस से मेल खाता है वह अच्छा है।" यही है, यह मानता है कि आपको व्यवस्थित कुछ भी शामिल करने की स्वतंत्रता है। यहां, हमारे पास विपरीत स्थिति है: भिन्न वर्तनी (और विविधताएं जो कभी प्रकट नहीं होती हैं) केवल 'इस तरह से यादृच्छिक' हैं। "कॉम्पैक्ट" में विस्तृत प्रयासों को "स्पष्ट" के लिए बहुत कम अंक मिलते हैं!
जैक्र

1
इसके अलावा अहो-कोरसिक एल्गोरिथ्म देखें, जो एक साथ स्ट्रिंग खोज के लिए इष्टतम है: en.wikipedia.org/wiki/…
थॉमस अहले

45

संभावित स्पेलिंग की अपनी सूची से एक दिलचस्प बात यह है कि इसमें निहित सूची के लिए केवल 3 साउंडेक्स मान हैं (यदि आप बाहरी 'कज़ज़फ़ी' की उपेक्षा करते हैं)

G310, K310, Q310

अब, वहां झूठी सकारात्मकता है ('Godby' भी G310 है), लेकिन साथ ही साथ सीमित रूप से हिट होने वाले मेटापोन हिट को मिलाकर आप उन्हें खत्म कर सकते हैं।

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

कुछ tweaks, और कुछ सिरिलिक लिप्यंतरण कहते हैं, और आप एक काफी मजबूत समाधान होगा।


2
कृपया ध्यान दें, साउंडेक्स अंग्रेजी के लिए विशिष्ट है, वहाँ अन्य उच्चारण नियमों के साथ अन्य भाषाओं के लिए अन्य ध्वन्यात्मक एल्गोरिदम मौजूद हैं
गुप्त

8
हालांकि यह सच है, हम यहाँ एक विषम स्थिति में हैं। प्राथमिक अनुरोध था "मैं गडफ्फी शब्द की खोज करने की कोशिश कर रहा हूं", लेकिन मुझे लगता है कि रेगेक्स एक लाल हेरिंग था। अरबी-> लैटिन लिप्यंतरण पर कोई नियम पुस्तिका नहीं है, और इस तरह के एक सूची से रेगेक्स को उलटने से मूल अनुरोध का पूरी तरह से जवाब नहीं मिलेगा।
टमाटरवशम

2
मुझे लगता है कि एक फजी-मिलान प्रणाली बेहतर अनुकूल है, लेकिन एक कस्टम एल्गोरिथ्म ओवरकिल लगता है। एक साउंडेक्स-मेटाफोन कॉम्बो का उपयोग करने के साथ-साथ रेगेक्स समाधान का प्रदर्शन होता है, जो आगे के अल्गोस अल्गोस का उपयोग करते हुए और भी अप्रत्याशित वर्तनी के लिए अनुमति देता है।
टमाटरवशम

मेटाफोन 2 और मेटाफोन 3 के उपयोग से बेहतर परिणाम प्राप्त होते हैं (यानी, मेटाफोन 2 में लगभग सब कुछ केडीएफ है, जहां मेटाफोन 1 काफी नहीं है)। हालांकि, Metaphone3 की कीमत लगभग 40 रुपये है।
गुप्तचर

27

CPAN मॉड्यूल Regexp का प्रयोग :: इकट्ठा करना :

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

यह सात अरबी यूनिकोड कोड बिंदुओं के मिलान से मेल खाता है जो الق concافي (यानी गैडफ़्फ़) शब्द बनाता है।


3
इसके बाद, Google अनुवाद और बॉब के अपने चाचा के माध्यम से बस nytimes.com पर जाएं।
बजे रॉबर्ट रॉसनी

19

यदि आप ऐसी मिलान वाली चीजों से बचना चाहते हैं, जिनका किसी ने उपयोग नहीं किया है (अर्थात "। +" की ओर झुकाव से बचें) तो आपका सबसे अच्छा तरीका एक नियमित अभिव्यक्ति बनाना होगा जो कि केवल सभी विकल्प हैं (उदाहरण के लिए। (क़दफ़ी | कडफी | ...) ) फिर एक DFA के लिए संकलित करें, और फिर DFA को एक नियमित अभिव्यक्ति में परिवर्तित करें। एक मामूली समझदार कार्यान्वयन मानते हुए जो आपको एक "संपीड़ित" नियमित अभिव्यक्ति देगा जो अप्रत्याशित रूप से निहित नहीं होने की गारंटी है।


2
मुझे पता है कि यह चिकित्सीय रूप से संभव है, लेकिन आप इसे व्यवहार में कैसे करेंगे (उदाहरण के लिए सामान्य गतिशील भाषा में)
रोरी

3
मैं इसके पीछे के सिद्धांत को समझता हूं, लेकिन @ रोरी की तरह, मुझे यह जानने में भी दिलचस्पी है कि आप वास्तव में यह कैसे करेंगे।
dancavallaro

हाँ, मैंने इसे करने के बारे में सोचा, बेहतर जवाब देने के लिए, लेकिन मैं इस समय थोड़ा व्यस्त हूं। मेरे पास code.google.com/p/lepl/source/browse/src/lepl/regexp/core.py पर कुछ (बदसूरत और खराब प्रलेखित) कोड है जो एक regexp से dfa का निर्माण करता है (वास्तव में, पार्सर दूसरी कक्षा में है , लेकिन कड़ी मेहनत वहाँ है; आप regexp -> nfa -> dfa) जाएं। dfa से regexp पर जाना आसान है (मुझे लगता है?)।
ओरू कुक

वास्तव में, वहाँ प्रलेखन मैं याद से बेहतर है: ओ) मूल विचार यह है कि आप फ़ाइल के शीर्ष के पास कक्षाओं के संदर्भ में regexp का वर्णन करते हैं। उसके बाद एक एनएफए में काफी आसानी से अनुवाद किया जा सकता है (एक एनएएफए वास्तव में संक्रमण का एक सेट है "यदि आपको यह पत्र मिलता है तो आप यहां या यहां जा सकते हैं ..." यह समझना बहुत आसान है)। dfa तो इसका एक प्रकार का "विस्तारित" संस्करण है, जहाँ आप बैकग्राउंड होने से बचते हैं; यह NfaToDfa द्वारा किया गया है (और कठिन भाग है)। dfa तब एक regexp के रूप में हो सकता है, जो कि बहुत ही जटिल वर्ण सेटों के रूप में लिखा गया है (!)
andrew Cooke

10

यदि आपको सभी 30 संभावनाओं की एक ठोस सूची मिल गई है, तो बस उन सभी को एक साथ "ors" के एक समूह के साथ मिलाएं। तब आप यह सुनिश्चित कर सकते हैं कि यह केवल आपके द्वारा सूचीबद्ध सटीक चीजों से मेल खाता है, और अधिक नहीं। आपका आरई इंजन शायद 30 विकल्पों के साथ आगे, और, अच्छी तरह से अनुकूलन करने में सक्षम होगा, भले ही यह अभी भी एक बड़ी बात नहीं है। मैन्युअल रूप से इसे "चालाक" में बदलने की कोशिश कर रहा है, आरई संभवतः बेहतर नहीं हो सकता है और खराब हो सकता है।


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)

निश्चित रूप से सबसे अधिक अनुकूलित संस्करण नहीं है, मैच को अधिकतम करने के लिए सिलेबल्स पर विभाजित करें, जबकि यह सुनिश्चित करने की कोशिश की जा रही है कि हमें गलत सकारात्मकता नहीं मिलती है।


7

जब से आप छोटे शब्दों का मिलान कर रहे हैं तो आप लेवेंशेटिन दूरी के साथ समानता खोज इंजन की कोशिश क्यों नहीं करते हैं ? आप अधिकतम कश्मीर प्रविष्टि या विलोपन की अनुमति दे सकते हैं । इस तरह आप अन्य विशिष्ट चीजों के लिए डिस्टेंस फ़ंक्शन को बदल सकते हैं जो आपकी विशिष्ट समस्या के लिए बेहतर काम करते हैं। सिमेट्रिक्स लाइब्रेरी में कई कार्य उपलब्ध हैं।


4

एक संभावित विकल्प http://regex.inginf.units.it उदाहरणों से नियमित अभिव्यक्ति उत्पन्न करने के लिए ऑनलाइन उपकरण है । इसे एक मौका दीजिए!


1

मिश्रित दृष्टिकोण क्यों नहीं? सभी संभावनाओं की एक सूची और एक जटिल रेगेक्स के बीच कुछ जो बहुत अधिक मेल खाता है।

रेगेक्स पैटर्न मिलान के बारे में है और मैं सूची में सभी वेरिएंट के लिए एक पैटर्न नहीं देख सकता। ऐसा करने की कोशिश करते हुए, "गाज़ाफी" या "क्वॉडहैफी" जैसी चीजें भी मिलेंगी, जो शायद सबसे अधिक इस्तेमाल किया जाने वाला संस्करण नहीं हैं और निश्चित रूप से सूची में नहीं हैं।

लेकिन मैं कुछ वेरिएंट के लिए पैटर्न देख सकता हूं, और इसलिए मैंने इसे समाप्त किया:

\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केवल पहले और अंतिम विकल्पों में शामिल हैं।
क्रिस्टोफर Creutzig

1

मुझे पता है कि यह एक पुराना सवाल है, लेकिन ...

इन दोनों रीगेक्स में से कोई भी सबसे सुंदर नहीं है, लेकिन वे अनुकूलित हैं और दोनों मूल पोस्ट में सभी विविधताओं से मेल खाते हैं ।

"लिटिल ब्यूटी" # 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

बस एक परिशिष्ट: आपको वैकल्पिक वर्तनी के रूप में "घेड्डाफी" जोड़ना चाहिए। तो आरई होना चाहिए

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

0

[GQK] [ahu] [dtez] \ '[adhz] च {1,2} (i | वाई)?

भागों में:

  • [GQK]
  • [Ahu]
  • [Dtez]
  • \ '?
  • [Adhz]
  • च {1,2} (i | वाई)

नोट: बस इस पर एक शॉट देना चाहता था।


-1

Q, G, या K के साथ और क्या शुरू होता है, बीच में विज्ञापन, z या t है, और "फाई" में समाप्त होता है जिसे लोग वास्तव में खोजते हैं?

/\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 । हालांकि उनमें से कुछ गलत सकारात्मक नहीं हैं ।
बीएमडीएन

2
और उस सूची के अतिरिक्त जो परिणाम [iy]सिर्फ के बजाय समाप्त होने से उत्पन्न होते हैं i:gelatinify gentrify ghostlify giddify gladify goutify gratify "Gyula Dessewffy" katasrofy katastrofy khadafy quantify quasi-deify quizzify
बीएमडान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.