différence entre search et match

regex négative

Le problème exposé dans ce sujet a été résolu.

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

+0 -0

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.

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+_.*).*
+1 -0

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

+0 -0

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;]+\]))"
+0 -0

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
+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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