2009-11-23 41 views
8

Ich versuche einen regulären Ausdruck zu finden, der mit jeder Zeichenfolge übereinstimmt, die nicht mit mpeg beginnt. Eine Verallgemeinerung von dies entspricht einer beliebigen Zeichenfolge, die nicht mit einem gegebenen regulären Ausdruck beginnt.Regulärer Ausdruck, der alles außer einem gegebenen regulären Ausdruck entspricht

habe ich versucht, so etwas wie wie folgt:

[^m][^p][^e][^g].* 

Das Problem dabei ist, dass es mindestens 4 Zeichen zu sein, die in der Zeichenfolge erfordert. Ich war nicht in der Lage, einen guten Weg zu finden, um damit umzugehen, und einen verallgemeinerten Weg, dies auf allgemeine Art und Weise zu handhaben.

Ich werde das in Python verwenden.

+2

Wenn Sie einen regulären Ausdruck, dass alles passt Sie nicht wollen, und alles, was man nicht will, passen , warum nicht einfach "nicht" benutzen? –

+3

Warum ist dieses Community-Wiki? –

+0

Oh, ich glaube nicht, dass ich den Zweck von Community-Wiki verstehe. Also habe ich das Kontrollkästchen versehentlich gewählt. –

Antwort

22
^(?!mpeg).* 

Diese negative Look-Ahead verwendet nur einen String passen, wo der Anfang doesn‘ t übereinstimmen mpeg. Im Wesentlichen erfordert es, dass "die Position am Anfang der Zeichenkette keine Position sein kann, an der wir mit der Regex mpeg übereinstimmen könnten, können wir erfolgreich übereinstimmen" - womit alles zusammenpasst, was nicht mit mpeg beginnt und nichts mit dem übereinstimmt .

Allerdings würde ich über den Kontext gespannt sein, in dem Sie diese verwenden - es könnten auch andere Optionen sein abgesehen von Regex, die entweder effizienter oder besser lesbar wäre, wie ...

if not inputstring.startswith("mpeg"): 
+0

+1 für beide, die die Frage beantworten und eine (wahrscheinlich) bessere Alternative bieten. –

+0

Der Regex wird von einem Benutzer über eine Webschnittstelle eingegeben. Also schreibe ich den Regex nicht selbst in das Python-Programm. Die Regex ist eine Art Filtereinstellung für einen Überwachungsordner, von dem meine Software Dateien abruft. Der Benutzer verwendet die Benutzeroberfläche, um die Regex zu füllen. Mein Python-Code verwendet diese Regex als Filterkriterium und wählt entsprechende Dateien aus dem Überwachungsordner aus. Vielen Dank für die Antwort. –

+0

Oder sogar 'wenn nicht inputstring.startswith ('mpeg')' – Paul

2

Versuchen ein look-ahead assertion:

(?!mpeg)^.* 

Oder wenn Sie nur negierte Klassen verwenden möchten:

^(.{0,3}$|[^m]|m([^p]|p([^e]|e([^g])))).*$ 
+0

Ihre Regex "negierte Klasse" wird nicht funktionieren. Überprüfe deine Syntax. –

+0

@ J-16 SDiZ: Warum denkst du das? – Gumbo

+0

Wahrscheinlich, weil er denkt, dass Sie versuchen, mpeg vor dem Start der Zeichenfolge "nicht übereinzustimmen". Obwohl es vollkommen legal ist, da^ein Null-Breite-Anker ist - er hat Recht, obwohl es verwirrend aussieht. –

8

verlieren Sie nicht Ihre Meinung mit Regex.

if len(mystring) >=4 and mystring[:4]=="mpeg": 
    print "do something" 

oder Verwendung starts() mit "nicht" keyword

if len(mystring)>=4 and not mystring.startswith("mpeg") 
+5

Beachten Sie, dass Sie nicht tatsächlich die 'len()' überprüfen müssen - Sie können Strings über ihre Grenzen hinaus schneiden, Sie werden nur weniger Zeichen zurück. – Amber

+0

ja, das weiß ich. nur dass ich die Anforderung von OP vielleicht falsch gelesen habe. Er sagte: "Es müssen mindestens 4 Zeichen in der Zeichenfolge vorhanden sein". Das Schlüsselwort ist "in der Zeichenfolge". Es kann eine lange Zeichenfolge sein und er kann diese Anforderung auch haben. Wie auch immer, es ist bis zu OP, um es richtig zu machen. – ghostdog74

+0

Ich denke, dieses Bit sagte, dass sein ursprünglicher Versuch einer Regex 4 Zeichen in der Zeichenfolge erforderte, als er eigentlich alles abgleichen wollte, das nicht mit "mpeg" anfing, selbst wenn es weniger als 4 Zeichen war. – Amber

0

Ihr regexp nicht entsprechen würde "NPEG", ich glaube, Sie mit ^($|[^m]|m($|[^p]|p($|[^e]|e($|[^g])))) kommen müsste, was ziemlich schrecklich. Eine andere Alternative wäre ^(.{0,3}$|[^m]|.[^p]|..[^e]|...[^g]) , die nur etwas besser ist.

Also ich denke, Sie wirklich eine Vorgriffs Behauptung vorgeschlagen verwenden sollten, wie von Dav und Gumbo :-)

+0

Ihre Alternative ist keine Alternative, da sie nicht korrekt ist. Es würde nicht mit * npeg * übereinstimmen. – Gumbo

+0

Hast du es versucht? re.match (r "^ (. {0,3} $ | [^ m] |. [^ p] | .. [^ e] | ... [^ g])", "npeg") gibt a zurück Objekt abgleichen Es funktioniert, weil [^ m] passiert. –

Verwandte Themen