2009-11-23 7 views
8

J'essaie de trouver une expression régulière qui correspond à toute chaîne qui ne commence pas par mpeg. Une généralisation de ceci correspond à toute chaîne qui ne commence pas avec une expression régulière donnée.Expression régulière correspondant à tout sauf une expression régulière donnée

J'ai essayé quelque chose comme ce qui suit:

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

Le problème est qu'il nécessite au moins 4 caractères pour être présents dans la chaîne. Je n'ai pas été capable de trouver un bon moyen de gérer cela et une manière généralisée de gérer cela de manière générale.

Je vais l'utiliser en Python.

+2

Si vous avez une expression régulière qui correspond à tout ce que vous ne voulez pas, et ne correspond pas à tout ce que vous voulez , pourquoi ne pas simplement utiliser «non»? –

+3

Pourquoi ce wiki communautaire? –

+0

Oh, je ne pense pas comprendre le but du wiki communautaire. J'ai donc coché la case par erreur. –

Répondre

22
^(?!mpeg).* 

Il utilise un test avant négatif pour correspondre uniquement une chaîne où le début doesn » t match mpeg. Essentiellement, il faut que "la position au début de la chaîne ne puisse pas être une position où si nous commencions à correspondre à la regex mpeg, nous pourrions correspondre" - ce qui correspond à tout ce qui ne commence pas par mpeg, et ne correspond à rien .

Cependant, je serais curieux de savoir le contexte dans lequel vous utilisez ce - il pourrait y avoir d'autres options mises à part de regex qui seraient soit plus efficace ou plus facile à lire, tels que ...

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

+1 pour les deux réponses à la question, et de fournir une (probablement) meilleure alternative. –

+0

L'expression régulière est saisie par un utilisateur via une interface Web. Donc je n'écris pas l'expression rationnelle moi-même dans le programme python. L'expression régulière est en quelque sorte un paramètre de filtre pour un dossier de surveillance à partir duquel mon logiciel récupère les fichiers. l'utilisateur utilise l'interface utilisateur pour remplir l'expression rationnelle. Mon code python prend cette regex comme critère de filtrage et récupère les fichiers appropriés dans le dossier de surveillance. Merci beaucoup à la réponse. –

+0

Ou même 'si non inputtring.startswith ('mpeg')' – Paul

2

Essayez un look-ahead assertion:

(?!mpeg)^.* 

Ou si vous voulez utiliser des classes niées seulement:

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

votre regex "classe niée" ne fonctionnera pas. vérifiez votre syntaxe. –

+0

@ J-16 SDiZ: Pourquoi pensez-vous cela? – Gumbo

+0

Probablement parce qu'il pense que vous essayez de "ne pas correspondre" mpeg avant le début de la chaîne. Bien que ce soit parfaitement légal puisque^est une ancre de largeur nulle - il a raison dans la mesure où cela semble confus. –

8

ne perdez pas votre esprit avec regex.

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

ou l'utilisation startswith() avec mot-clé "non"

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

Notez que vous n'avez pas réellement besoin de la vérification 'len()' - vous pouvez découper des chaînes au-delà de leurs limites, vous obtiendrez juste moins de caractères. – Amber

+0

oui, je le sais. juste que peut-être j'ai mal interprété l'exigence d'OP. Il a dit "il faut au moins 4 caractères pour être présents dans la chaîne". Le mot clé est "dans la chaîne". Ce peut être une longue chaîne et il peut avoir cette exigence aussi bien. Quoi qu'il en soit, c'est maintenant à OP de le faire correctement. – ghostdog74

+0

Je pense que ce bit disait que sa tentative d'origine d'une regex nécessitait 4 caractères dans la chaîne, quand il voulait réellement faire correspondre tout ce qui ne commençait pas par "mpeg", même s'il était inférieur à 4 caractères. – Amber

0

Votre expression rationnelle ne correspondrait pas à "NPEG", je pense que vous auriez besoin venir avec ^($|[^m]|m($|[^p]|p($|[^e]|e($|[^g])))), ce qui est tout à fait horrible. Une autre alternative serait ^(.{0,3}$|[^m]|.[^p]|..[^e]|...[^g]) qui n'est que légèrement meilleure.

Je pense que vous devriez vraiment utiliser une affirmation d'anticipation comme suggéré par Dav et Gumbo :-)

+0

Votre alternative n'est pas une alternative car elle n'est pas correcte. Cela ne correspondrait pas à * npeg *. – Gumbo

+0

Avez-vous essayé? re.match (r "^ (. {0,3} $ | [^ m] |. [^ p] | .. [^ e] | ... [^ g])", "npeg") renvoie un Faire correspondre l'objet. Cela fonctionne parce que [^ m] passe. –

Questions connexes