我正在尝试搜索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
答案 0 :(得分:274)
简单... (Qadaffi|Khadafy|Qadafi|
... )
...它是自我记录的,可维护的,假设您的正则表达式引擎实际上编译正则表达式(而不是解释它们),它将编译为与更混淆的解决方案相同的DFA。
编写紧凑的正则表达式就像使用短变量名来加速程序一样。它只会在您的编译器脑死亡时才有用。
答案 1 :(得分:137)
\b[KGQ]h?add?h?af?fi\b
阿拉伯语转录是(Wiki说)“Qaḏḏāfī”,所以可能会添加一个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
答案 2 :(得分: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;
?>
进行一些调整,让我们说一些西里尔音译,你就会有一个相当强大的解决方案。
答案 3 :(得分: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))
答案 4 :(得分:23)
我认为你在这里过于复杂化了。正确的正则表达式非常简单:
\u0627\u0644\u0642\u0630\u0627\u0641\u064a
它匹配形成单词القذافي(即Gadaffi)的七个阿拉伯语Unicode代码点的串联。
答案 5 :(得分:19)
如果你想避免匹配任何人没有使用的东西(即避免倾向于“。+”),你最好的方法是创建一个正则表达式,这只是所有的选择(例如。(Qadafi | Kadafi |。 ..))然后将其编译为DFA,然后将DFA转换回正则表达式。假设一个适度合理的实现会给你一个“压缩”的正则表达式,保证不包含意想不到的变体。
答案 6 :(得分:10)
如果你有一个包含所有30种可能性的具体列表,只需将它们与一堆“ors”连接在一起。然后你可以确定它只匹配你列出的确切内容,而不是更多。您的RE引擎可能会进一步优化,并且有30个选择,即使它不是它仍然不是一个大问题。试图通过手动将其变成“聪明”的RE而无法改善并且可能会变得更糟。
答案 7 :(得分: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)
当然不是最优化的版本,在音节上分开以最大化匹配,同时确保我们不会出现误报。
答案 8 :(得分:7)
好吧,因为你要匹配小词,为什么不尝试similarity search engine距离为Levenshtein?您最多可以允许 k 插入或删除。通过这种方式,您可以将距离函数更改为对您的特定问题更有效的其他事物。 simMetrics库中有许多可用的功能。
答案 9 :(得分:4)
可能的替代方法是用于从示例http://regex.inginf.units.it生成正则表达式的在线工具。 给它一个机会!
答案 10 :(得分:1)
为什么不采取混合方式?所有可能性列表和复杂的正则表达式之间的东西太多了。
Regex是关于模式匹配的,我看不到列表中所有变体的模式。试图这样做,也会发现像“Gazzafy”或“Quud'haffi”这样的东西,这些东西很可能不是一个二手的变种,绝对不在列表中。
但我可以看到一些变种的模式,所以我最终得到了这个:
\b(?:Gheddafi|Gathafi|Kazzafi|Kad'afi|Qadhdhafi|Qadthafi|Qudhafi|Qu?athafi|[KG]h?add?h?aff?[iy]|Qad[dh]?afi)\b
在开头我列出了我看不到模式的那些,然后是一些有模式的变体。
上查看答案 11 :(得分: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
在和平中休息,Muammar。
答案 12 :(得分:0)
只是一个附录:你应该添加“Gheddafi”作为替代拼写。所以RE应该是
\b[KG]h?[ae]dd?af?fi$\b
答案 13 :(得分:0)
Q,G或K的其他内容在中间有d,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
有趣的是我被低估了。有人可以在评论中留下一些误报吗?
答案 14 :(得分:0)
[GQK] [ahu] + [dtez] + \'?[adhz] + f {1,2}(i | y)
部分:
注意:刚刚学习了正则表达式,想尝试一下。稍后会解决小错误