différence entre search et match

regex négative

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je travail actuellement sur un programme qui utilise des regex Le code utilise re.search et cela m’ennuie car j’ai du mal à construire des regex négative (renvoi un match si on ne correspond pas au pattern)

Évidement, je ne peux pas non plus modifier le code sans induire un tas de tests que l’on a pas envie de passer (faute de budget)

Voila mes exemples:

import re

1
2
3
4
5
6
7
8
def testPattern(pattern, value):
    print("match : {0}".format(re.match(pattern, value)))
    print("search : {0}".format(re.search(pattern, value)))


notGood = "S01aa_C1_FOO BAR"
p = "(?!^(S\d+_C\d+_.*))"
testPattern(p, notGood)

Résultat :

1
2
match : None
search : <_sre.SRE_Match object at 0x023181E0>

Dans mon exemple, je voudrai avoir les expressions qui ne commence par S suivie de chiffre suivie de "_" suivie de C suivie de chiffre suivie de "_" suivie n’importe quels caractères

Je n’arrive pas à comprendre pourquoi la regex négative retourne un match lorsque mon expression correspond au pattern

Édité par Angelo

+0 -0

Cette réponse a aidé l’auteur du sujet

Salut,

Je ne reproduis pas les mêmes résultats avec le code que tu donnes, tu es sûr de tes exemples ?

Dans tous les cas il y a bien une différence entre search et match : match ne fait la recherche qu’au tout début de la chaîne alors que search la débute n’importe où : voir la doc à ce propos.

Aussi, je doute que le ^ que tu insères ait une quelconque utilité puisqu’il n’est pas au début de l’expression.

Cette réponse a aidé l’auteur du sujet

Tout à fait d’accord avec entwanne. D’ailleurs, en plus de ne pas avoir d’utilité ou il est, il fait que toute chaîne ne commençant pas par ’S’ est valide, donc tous les caractères, tant qu’ils ne sont pas ’S’ et en première position vont être valides avec match.

De ce que j’ai cru comprendre tu souhaites avoir un truc du style là:

1
^(?!S\d+_C\d+_.*).*

Édité par JuDePom

+1 -0
Auteur du sujet

Salut,

Je ne reproduis pas les mêmes résultats avec le code que tu donnes, tu es sûr de tes exemples ?

En effet, à vouloir trop simplifier et masquer certaines informations, mon exemple ne donne pas le résultat que j’indique

Merci à vous 2 pour le ^. J’ai une autre regex dans ce style, je vais essayer de la produire moi même sinon je vous solliciterai à nouveau

Édité par Angelo

+0 -0
Auteur du sujet

Je n’arrive décidément pas à construire ma regex Les expressions correctes ont ce format

Commence par A ou B suivie de [ suivie de nombres séparés par des ;(si il n’y a qu’un nombre alors il n’y a pas de ;) suivie de ] suivie de n’importe quel caractère
Une chaine vide est également correcte

je souhaite avoir toutes les expressions incorrectes évidemment

Je ne suis pas très loin: mon soucis actuel est que les chaines vide match mais je ne vois pas comment éviter cela

1
"^(?!([AB]\[[\d;]+\]))"

Édité par Angelo

+0 -0

Cette réponse a aidé l’auteur du sujet

Bonjour,

Je ne suis pas certain de ce que tu veux mais je te propose ceci :

1
pattern = "^(?![AB]\[\d+(?:;\d+)*\].*|$).*"

Tu peux le traduire par : tout (le dernier .*) SAUF ce qui commence par A ou B, suivi de … OU ce qui est vide (commence par une fin de chaîne de caractère $). La parenthèse (?: ... ) est simplement non capturante (pas de groupe associé).

Avec un petit programme :

1
2
3
4
def test(pattern, value):
    m = re.search(pattern,value)
    if m:
        print(m.group())
  • test(pattern,"A[3,3]") produit A[3,3]
  • test(pattern,"A[3]") ne produit rien
  • test(pattern,"A[3;3]def") ne produit rien
  • test(pattern,"A[3,3]def") produit A[3,3]def
  • test(pattern,"") ne produit rien

Édité par Bidouille

+1 -0

Elle est peut-être propre au module re de python (cf. la doc dans laquelle j’ai recherché les éléments nécessaires). Mais ce n’est pas elle qui a résolu le problème que tu présentais, c’est l’ajout du $ pour gérer les chaînes vides.

Édité par Bidouille

+0 -0

(?: n’est pas propre au module re, c’est une partie intégrante de la syntaxe des regex, ça veut juste dire que ton bloc n’est pas "capturant" (il ne créé pas de groupe pour extraire les données).

Édité par JuDePom

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte