Expression régulière qui correspond à tout sauf à une expression régulière donnée
Je suis à essayer de comprendre une expression régulière qui correspond à toute chaîne qui ne commence pas avec mpeg. Une généralisation de cette est la mise en correspondance de chaîne qui ne commence pas par une expression régulière donnée.
J'ai essayé quelque chose comme comme suit:
[^m][^p][^e][^g].*
Le problème, c'est qu'il nécessite au moins 4 caractères pour être présent dans la chaîne. Je n'étais pas en mesure de comprendre une bonne façon de gérer cela et de manière généralisée pour les traiter dans un usage général.
Je vais être en utilisant cette en Python.
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
Pourquoi est-ce le wiki de la communauté?
Oh, je ne pense pas que je comprends le but de wiki de la communauté. J'ai donc sélectionné la case à cocher par erreur.
not
?Pourquoi est-ce le wiki de la communauté?
Oh, je ne pense pas que je comprends le but de wiki de la communauté. J'ai donc sélectionné la case à cocher par erreur.
OriginalL'auteur |
Vous devez vous connecter pour publier un commentaire.
Il utilise une anticipation négatif, à seulement correspondre à une chaîne où le début ne correspond pas
mpeg
. Essentiellement, il exige que "la position au début de la chaîne ne peut pas être une position où si nous avons commencé correspondant à l'expression rationnellempeg
, nous avons pu avec succès match" - ce qui correspond à quelque chose qui ne commence pas avec mpeg, et ne correspond pas à ce qui ne.Cependant, je serais curieux de connaître le contexte dans lequel vous êtes en utilisant ce - qu'il pourrait y avoir d'autres options de côté de regex qui serait soit plus efficace ou plus lisible, comme...
La regex est entré par un utilisateur à travers une interface web. Donc, je n'écris pas de la regex moi-même dans le programme python. L'expression régulière est une sorte de filtre pour un dossier de veille à partir de laquelle mon logiciel récupère les fichiers. l'utilisateur utilise l'interface utilisateur de remplir le regex. Mon code python prend cette expression que les critères de filtrage et ramasse les fichiers appropriés à partir du dossier de contrôle. Merci beaucoup à propos de la réponse.
Ou même
if not inputstring.startswith('mpeg')
OriginalL'auteur
ne perdez pas votre esprit avec la regex.
ou de l'utilisation startswith() avec "pas" mot-clé
len()
l'enregistrement, vous pouvez découper des chaînes au-delà de leurs frontières, il vous suffit de faire moins de caractères de retour.oui, je le sais. juste que peut-être j'ai mal lu, OP. Il a dit "il faut au moins 4 caractères pour être présents dans la chaîne". Le mot clé est "à la chaîne". Il peut être une chaîne longue et il peut avoir cette exigence. De toute façon, jusqu'à son OP maintenant pour l'obtenir fait.
Je pense que peu de dire que le son d'origine tentative de regex 4 caractères dans la chaîne, quand il voulait correspondent à rien de ce pas au début avec "mpeg", même si elle était de moins de 4 caractères.
Veuillez voir mon commentaire dans le post ci-dessus, Les regex sont fournies par l'utilisateur via une INTERFACE utilisateur et utilisés en interne par le code python comme il est.
eh bien, je pense que vous devez l'indiquer lorsque vous validez la question.
OriginalL'auteur
Essayer un look-ahead affirmation:
Ou si vous souhaitez utiliser niée classes seulement:
SDiZ: Pourquoi pensez-vous cela?
Probablement parce qu'il pense que vous êtes en train de "non-match" mpeg avant le début de la chaîne. Même si c'est parfaitement légal depuis ^ est un zéro-largeur d'ancrage - il à ce que le droit dans la mesure où elle sembler confus.
Cela ne correspond pas à "mpe" depuis que vous avez écrit, " mpe "doit avoir une lettre qui la suit, ce qui n'est pas un "g", et vous ne laissez pas la fin de la chaîne de possibilité.
le
.{0,3}
partie pourrait correspondre à "mpe".OriginalL'auteur
Votre regexp ne correspond pas à "npeg", je pense que vous devez venir avec de
^($|[^m]|m($|[^p]|p($|[^e]|e($|[^g]))))
, ce qui est assez horrible.Une autre alternative serait
^(.{0,3}$|[^m]|.[^p]|..[^e]|...[^g])
qui est seulement légèrement mieux.
Donc, je pense que vous devriez vraiment utiliser un "look-ahead" affirmation comme suggéré par Dav et le Gumbo 🙂
Avez-vous essayé? re.match(r"^(.{0,3}$|[^m]|.[^p]|..[^e]|...[^g])", "npeg") renvoie un objet Match. Cela fonctionne parce que [^m] passe.
OriginalL'auteur