用于搜索Gadaffi的正则表达式


361

我正在尝试搜索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个变体匹配:

加达菲
加达菲
加达菲
卡扎菲
卡扎菲
卡扎菲
卡扎菲
加沙菲
加达菲
加达菲
加达菲
加达菲
吉达菲
卡达菲
卡达菲
卡达菲
卡扎菲
卡扎菲
卡达菲
卡达菲
卡达菲
卡达菲
卡扎菲
卡扎菲
卡扎菲
卡扎菲
卡塔菲
夸沙菲
古达菲
卡达菲

8
您缺少哪些?您在哪里搜索,使用正则表达式进行网络搜索吗?
捷克学2011年

43
总是有新的期刊出版,因此,如果它们继续写有关Gadaffi的文章,您将倾向于.+成为唯一有效的正则表达式。
moinudin

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:实际上,自首次提交RCS(1998年11月3日星期二21:38:52 1998 +0000)以来,Khadafy测试就是GNU grep测试套件的一部分,而且可能更早!
Paolo Bonzini 2011年

Answers:


138

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

(维基百科说)阿拉伯语转录为“Qaḏḏāfī”,所以也许加一个Q。然后加上一个H(“ Gadhafi”,如本文所述)。

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


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

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


编辑

为了匹配您稍后提到文章中的所有名称,应该将它们全部匹配。我们只是希望它不会与其他很多东西匹配: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,我用一个较长的正则表达式进行了编辑,该正则表达式与您发布的文章中的所有名称匹配(除了两个带有?字母而不是字母的名称)。可能不过是太过分了。
捷克学2011年

2
这也与“ Quuzzafi”和许多其他误报相匹配,尽管我认为在搜索新闻报道等方面没有太大关系。
ben w

275

易... ... (Qadaffi|Khadafy|Qadafi|... ... )... ...它的自我记录,维护,并假设你的正则表达式引擎实际上编译正则表达式(而不是将它们解释),它会编译成一个更加模糊的解决方案将使用同一个DFA。

编写紧凑的正则表达式就像使用短变量名来加速程序。仅当您的编译器出现故障时才有用。


23
好答案!人们使用正则表达式的频率远远超过了他们实际工作的方式。
Thomas Ahle

3
我也非常喜欢此解决方案的简单性,但是令我惊讶的是它可以编译成相同的DFA。您是否有谈论此内容的链接?直观上看,这似乎比以前制作的regex效率低,或者下面的答案建议在相同的ord名称列表上使用Regexp :: Assemble perl模块。
里安·桑德森

6
-1正则表达式的全部要点是减少通常可能出现的情况(在这种情况下)是相对较短的公式的很长的替代方案。结果通常比执行未优化的详尽搜索更快。
martineau 2011年

7
没错,正则表达式的目的是为大量值提供紧凑,清晰的表示形式。但是基本概念是提出一个正则表达式并说“任何与此匹配的东西都是好的”。也就是说,它假定您可以自由地包含所有系统的内容。在这里,我们遇到了相反的情况:变体拼写(以及从未出现过的变体)仅在“完全随机”的这一方面。对“紧凑”进行精心设计的尝试对于“清晰”而言得分很低!
jackr 2011年

1
:还检查了阿霍Corasick算法,这是同时字符串搜索最佳en.wikipedia.org/wiki/...
托马斯AHLE

45

潜在拼写列表中值得注意的一件事是,包含的列表只有3个Soundex值(如果您忽略异常值“ Kazzafi”)

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

进行一些调整,然后说西里尔字母音译,您将拥有一个相当强大的解决方案。


2
请注意,soundex专用于英语,确实存在针对其他具有不同发音规则的其他语言的语音算法
隐身

8
虽然这是事实,但我们在这里处于一种奇怪的情况。主要要求是“我正在尝试搜索Gadaffi”一词,但我觉得正则表达式是红色鲱鱼。没有关于阿拉伯语->拉丁语音译的规则手册,因此从列表中逆转正则表达式将无法完全回答原始请求。
tomwalsham 2011年

2
我觉得模糊匹配系统更适合,但是自定义算法似乎过大了。使用soundex-metaphone组合的性能似乎与regex解决方案一样好,允许在仍使用现成算法的情况下实现更多意外拼写。
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

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


3
接下来,只需通过Google翻译传送nytimes.com,鲍勃就是你的叔叔。
罗伯特·罗斯尼

19

如果您想避免匹配没有人使用过的东西(即避免趋向于“。+”),则最好的方法是创建一个正则表达式,该正则表达式就是所有替代方案(例如(Qadafi | Kadafi | ...) ),然后将其编译为DFA,然后将DFA转换回正则表达式。假设有一个合理的实现,它将为您提供一个“压缩”正则表达式,保证不会包含意外的变体。


2
我知道这在理论上是可能的,但是您将如何在实践中做到这一点(例如使用som通用动态语言)
罗里

3
我了解这背后的理论,但是像@Rory一样,我也很想知道您实际上是如何做到这一点的。
dancavallaro 2011年

是的,我考虑过要这样做,以便给出更好的答案,但此刻我有点忙。我在code.google.com/p/lepl/source/browse/src/lepl/regexp/core.py上有一些(丑陋且记录不良的)代码,该代码可从regexp构造dfa(实际上,解析器在另一个类中,但是辛苦了;您去了regexp-> nfa-> dfa)。从dfa到regexp很容易(我认为?)。
安德鲁·库克

实际上,该文档比我记得的要好:o)基本思想是,您根据文件顶部附近的类来描述regexp。然后可以很容易地将其翻译为nfa(nfa实际上只是一组过渡,上面写着“如果您收到这封信,那么您可以在这里或在这里...”,这很容易理解)。那么dfa是该版本的一种“扩展”版本,您可以在其中避免回溯;这是由NfaToDfa完成的(这是最困难的部分)。然后dfa可以作为正则表达式本身写成非常复杂的字符集(?!)
安德鲁·

10

如果您已列出所有30种可能性的具体清单,只需将它们与一堆“或”串在一起即可。然后,您可以确保它仅匹配列出的确切内容,而不再匹配。您的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

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

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

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

0

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

部分:

  • [GQK]
  • [ahu] +
  • [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 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.