Expression régulière pour rechercher Gadaffi

J’essaie de chercher le mot Gadaffi. Quelle est la meilleure expression régulière pour rechercher cela?

Ma meilleure tentative jusqu’à présent est la suivante:

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

Mais il me semble que certains journaux me manquent encore. Aucune suggestion?

Mise à jour: J’ai trouvé une liste assez complète ici: http://blogs.abcnews.com/theworldnewser/2009/09/how-many-different-ways-can-you-spell-gaddafi.html

La réponse ci-dessous correspond aux 30 variantes:

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

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

La transcription arabe est (Wiki dit) “Qaḏḏāfī”, donc peut-être append un Q. Et un H (“Kadhafi”, comme le mentionne l’article (voir ci-dessous)).

Au fait, pourquoi y a-t-il un $ à la fin de la regex?


Btw, bel article sur le sujet:

Kadhafi, Kadafi ou Kadhafi? Pourquoi le nom du dirigeant libyen est-il si différent? .


MODIFIER

Pour correspondre à tous les noms de l’ article que vous avez mentionné plus tard , cela devrait correspondre à tous. Espérons que cela ne correspondra pas à beaucoup d’autres choses: D

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

Facile … (Qadaffi|Khadafy|Qadafi|) … il est auto-documenté, maintenable, et en supposant que votre moteur d’expressions rationnelles comstack des expressions régulières (au lieu de les interpréter), il sera compilé dans le même DFA qu’un solution plus obscure serait.

Ecrire des expressions régulières compactes, c’est comme utiliser des noms de variables courts pour accélérer un programme. Cela aide seulement si votre compilateur est mort cérébrale.

Une chose intéressante à noter dans votre liste d’orthographes potentielles est qu’il n’y a que 3 valeurs Soundex pour la liste contenue (si vous ignorez la valeur aberrante «Kazzafi»)

G310, K310, Q310

Maintenant, il y a des faux positifs là-dedans (‘Godby’ est aussi G310), mais en combinant les hits limités du métaphone aussi, vous pouvez les éliminer.

  1){ $matches[] = $item; } } $pattern = implode("|",$matches); $text = preg_replace("/($pattern)/","$1",$text); echo $text; ?> 

Quelques ajustements, et disons une translittération cyrillique, et vous aurez une solution assez robuste.

Utilisation du module 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; 

Cela produit l’expression régulière suivante:

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

Je pense que vous êtes trop compliqué ici. La regex correcte est aussi simple que:

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

Il correspond à la concaténation des sept points de code arabes Unicode qui forment le mot القذافي (ie Gadaffi).

Si vous voulez éviter de faire correspondre des choses que personne n’a utilisées (c’est-à-dire éviter de tendre vers “. +”), Votre meilleure approche serait de créer une expression régulière qui ne soit que toutes les alternatives (par exemple: Qadafi | Kadafi | …) ) puis comstackz cela dans un DFA, puis convertissez le DFA en une expression régulière. En supposant une implémentation modérément sensible qui vous donnerait une expression régulière “compressée”, garantie de ne pas contenir de variantes inattendues.

Si vous avez une liste concrète des 30 possibilités, concaténez-les toutes avec un ensemble de “ors”. Vous pouvez alors être sûr qu’il ne correspond qu’aux éléments que vous avez listés, et pas plus. Votre moteur RE sera probablement en mesure d’optimiser encore plus et, bien, avec 30 choix, même si ce n’est pas encore le cas. Essayer de tourner en rond pour le transformer manuellement en un RE “intelligent” ne peut pas se révéler meilleur et peut se révéler pire.

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

Certainement pas la version la plus optimisée, divisée en syllabes pour maximiser les correspondances tout en veillant à ne pas avoir de faux positifs.

Eh bien, puisque vous faites correspondre des petits mots, pourquoi ne pas essayer un moteur de recherche de similarité avec la distance Levenshtein ? Vous pouvez autoriser au maximum k insertions ou suppressions. De cette façon, vous pouvez changer la fonction de distance en fonction d’autres choses qui fonctionnent mieux pour votre problème spécifique. De nombreuses fonctions sont disponibles dans la bibliothèque simMesortingcs.

Une alternative possible est l’outil en ligne pour générer des expressions régulières à partir des exemples http://regex.inginf.units.it . Donnez-lui une chance!

Pourquoi ne pas faire une approche mixte? Quelque chose entre une liste de toutes les possibilités et une Regex compliquée qui correspond beaucoup trop.

Regex concerne la correspondance de motifs et je ne peux pas voir de motif pour toutes les variantes de la liste. En essayant de le faire, on trouvera aussi des choses comme “Gazzafy” ou “Quud’haffi” qui ne sont probablement pas une variante utilisée et qui ne figurent pas sur la liste.

Mais je peux voir des schémas pour certaines variantes, et je me suis donc retrouvé avec ceci:

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

Au début, je liste ceux où je ne vois pas de motif, suivi de quelques variantes où il y a des motifs.

Voir ici sur http://www.rubular.com

Je sais que c’est une vieille question, mais …

Aucune de ces deux expressions n’est la plus jolie, mais elles sont optimisées et toutes deux correspondent à TOUTES les variations dans le message original.

“Little Beauty” # 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) 

“Little Beauty” # 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 

Repose en paix, Muammar.

Juste un addendum: vous devez append “Gheddafi” comme orthographe alternative. Donc, le RE devrait être

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

Qu’est-ce qui commence par Q, G ou K, a ad, z ou t au milieu, et se termine par “fi” que les gens recherchent réellement ?

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

Terminé.

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

Intéressant que je me fasse abattre. Est-ce que quelqu’un peut laisser des faux positifs dans les commentaires?