regulärer - regex zeichenfolge ausschließen



Regulärer Ausdruck für die Suche nach Gadaffi (10)

Ich versuche nach dem Wort Gadaffi zu suchen. Was ist der beste reguläre Ausdruck, um danach zu suchen?

Mein bisher bester Versuch ist:

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

Aber mir scheinen immer noch einige Zeitschriften zu fehlen. Irgendwelche Vorschläge?

Update: Ich habe eine ziemlich umfangreiche Liste hier gefunden: http://blogs.abcnews.com/theworldnewser/2009/09/how-many-different-ways-can-you-spell-gaddafi.html

Die folgende Antwort stimmt mit allen 30 Varianten überein:

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

Answer #1

Eine interessante Sache aus Ihrer Liste der möglichen Schreibweisen ist, dass es nur 3 Soundex-Werte für die enthaltene Liste gibt (wenn Sie den Ausreißer "Kazzafi" ignorieren)

G310, K310, Q310

Nun gibt es dort falsche Positive ('Godby' ist auch G310), aber durch die Kombination der begrenzten Metaphontreffer können Sie sie auch eliminieren.

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

Ein paar Verbesserungen und eine kyrillische Transkription, und Sie werden eine ziemlich robuste Lösung haben.


Answer #2

Eine mögliche Alternative ist das Online-Tool zum Erzeugen regulärer Ausdrücke aus Beispielen http://regex.inginf.units.it . Gib es eine Chance!


Answer #3

Ich denke du machst die Dinge hier komplizierter. Die richtige Regex ist so einfach wie:

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

Es entspricht der Verkettung der sieben arabischen Unicode-Codepunkte, die das Wort الذذافي (dh Gadaffi) bilden.


Answer #4

Ich weiß, das ist eine alte Frage, aber ...

Keine dieser beiden Regexes ist die Schönste, aber sie sind optimiert und beide stimmen mit ALLEN Variationen im Original Post überein.

"Kleine Schönheit" # 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)

"Kleine Schönheit" # 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

Ruhe in Frieden, Muammar.


Answer #5

Nur ein Addendum: Sie sollten "Gheddafi" als alternative Schreibweise hinzufügen. Also sollte der RE sein

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

Answer #6

Verwenden des CPAN-Moduls 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;

Dies erzeugt den folgenden regulären Ausdruck:

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

Answer #7

Was sonst beginnt mit Q, G oder K, hat ad, z oder t in der Mitte und endet mit "fi", nach dem die Leute tatsächlich suchen?

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

Erledigt.

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

Interessant, dass ich downvoted werde. Kann jemand falsche Kommentare in den Kommentaren hinterlassen?


Answer #8

Wenn Sie eine konkrete Auflistung aller 30 Möglichkeiten haben, verketten Sie sie alle zusammen mit einer Reihe von "ors". Dann können Sie sicher sein , dass es nur genau den Dingen entspricht, die Sie aufgelistet haben, und nicht mehr. Ihr RE-Motor wird wahrscheinlich in der Lage sein, weiter zu optimieren, und, gut, mit 30 Möglichkeiten, auch wenn es nicht immer noch eine große Sache ist. Wenn man versucht, es manuell in einen "cleveren" RE umzuwandeln, kann es unmöglich besser werden und schlechter werden.


Answer #9

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

Die arabische Transkription ist (Qaḏḏāfī), also vielleicht ein Q. Und ein H ("Gaddafi", wie der Artikel (siehe unten) erwähnt).

Übrigens, warum gibt es ein $ am Ende der Regex?

Übrigens, schöner Artikel zum Thema:

Gaddafi, Kadafi oder Gaddafi? Warum schreibt der Name des libyschen Führers so viele verschiedene Arten? .

BEARBEITEN

Um alle Namen in dem Artikel zu finden, den Sie später erwähnt haben , sollte dies mit allen übereinstimmen. Lass uns nur hoffen, dass es nicht mit vielen anderen Dingen übereinstimmt: D

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

Answer #10
(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)

Sicherlich nicht die am besten optimierte Version, aufgeteilt auf Silben, um die Übereinstimmungen zu maximieren und gleichzeitig sicherzustellen, dass wir keine falschen positiven Ergebnisse erhalten.





search