19 Stimmen

Regulärer Ausdruck, der auf alles außer einem bestimmten regulären Ausdruck passt

Ich versuche, einen regulären Ausdruck zu finden, der auf jede Zeichenfolge passt, die nicht mit mpeg beginnt. Eine Verallgemeinerung dieser ist jede Zeichenfolge, die nicht mit einem bestimmten regulären Ausdruck beginnen übereinstimmt.

Ich habe Folgendes versucht:

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

Das Problem dabei ist, dass mindestens 4 Zeichen in der Zeichenkette vorhanden sein müssen. Ich war nicht in der Lage, einen guten Weg zu finden, um dies zu handhaben und einen allgemeinen Weg, um dies in einem allgemeinen Zweck Weise zu behandeln.

Ich werde dies in Python verwenden.

35voto

Amber Punkte 473552
^(?!mpeg).*

Hierbei wird ein negativer Lookahead verwendet, um nur mit einer Zeichenkette übereinzustimmen, deren Anfang nicht übereinstimmt mpeg . Im Wesentlichen wird verlangt, dass "die Position am Anfang der Zeichenkette nicht eine Position sein darf, an der wir mit dem Abgleich der Regex beginnen würden mpeg erfolgreich abgleichen" - also alles, was nicht mit mpeg beginnt, und alles, was damit beginnt, wird nicht abgeglichen.

Allerdings wäre ich neugierig auf den Kontext, in dem Sie dies verwenden - es könnte andere Optionen neben regex, die entweder effizienter oder lesbarer wäre, wie z. B. ...

if not inputstring.startswith("mpeg"):

11voto

ghostdog74 Punkte 305138

Verlieren Sie nicht den Verstand mit Regex.

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

oder startswith() mit dem Schlüsselwort "not" verwenden

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

3voto

Gumbo Punkte 617646

Versuchen Sie eine Vorausschauende Behauptung :

(?!mpeg)^.*

Oder wenn Sie nur negierte Klassen verwenden wollen:

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

0voto

Jérémie Koenig Punkte 1148

Ihre Regexp würde nicht mit "npeg" übereinstimmen, ich denke, Sie müssten sich etwas einfallen lassen ^($|[^m]|m($|[^p]|p($|[^e]|e($|[^g])))) was ziemlich schrecklich ist. Eine andere Alternative wäre ^(.{0,3}$|[^m]|.[^p]|..[^e]|...[^g]) was nur geringfügig besser ist.

Daher denke ich, dass Sie wirklich eine Vorausschau-Behauptung verwenden sollten, wie von Dav und Gumbo vorgeschlagen :-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X