Aide Regex

Fermé
Zetud Messages postés 3 Date d'inscription mardi 15 décembre 2009 Statut Membre Dernière intervention 15 décembre 2009 - 15 déc. 2009 à 00:36
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 - 16 déc. 2009 à 14:04
Bonjour,

Je cherche les "La ville est fondé" sauf quand cette expression est précédée de "de". Mon essai :

[^\(de\)] la ville est fondé

Mon essai ne marche pas. Une idée ?

5 réponses

H0gS Messages postés 266 Date d'inscription dimanche 2 décembre 2007 Statut Contributeur Dernière intervention 10 septembre 2012 36
15 déc. 2009 à 00:42
N.B.
Attention! Veuillez prêter une attention particulière aux titres de vos futures discussions, car celui que vous avez attribué à cette discussion est inadéquat et contraire à la charte de CCM (Comment Ça Marche). Les termes: aide, svp, please, etc... son à évité, car peu importe le problème, la communauté de CCM tentera de le résoudre. Il est donc inutile de demander de l'aide dans votre titre.

Pour plus de renseignements, consultez la charte de CCM.

Bonne fin de journée!
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
15 déc. 2009 à 02:28
Bonsoir,



Il serait bien que tu fasses preuve d’un peu plus de rigueur.
Dans "La ville est fondé" il y a une majuscule en tête.
Dans [^\(de\)] la ville est fondé , il n’y en a pas et il y a un blanc devant.


Pour trouver les “de la ville est fondé“ sans qu’il y ait “de “ devant, il faut utiliser une “negative lookbehind assertion“

“(?<!de )de la ville est fondé“

Du moins est-ce ainsi qu’on écrit en Python.

https://docs.python.org/3/library/re.html#module-re
0
Zetud Messages postés 3 Date d'inscription mardi 15 décembre 2009 Statut Membre Dernière intervention 15 décembre 2009
15 déc. 2009 à 23:44
Mea culpa : je cherche bien "la ville est fondé", sans la majuscule.

Je ne comprend pas le problème de blanc que tu évoques. Dans ma proposition ( [^\(de\)] la ville est fondé ), je mets [^ ] pour exclure ce qu'il y a après le ^, \(de\) pour considérer "de" comme une chaine (à exclure), puis un espace, puis la "ville est fondée". Mais ça ne marche pas

Le script que tu proposes ne marche pas non plus ; il trouve les "de la ville est fondé", alors que je cherche justement à exclure les cas où "la ville est fondé" est précédé de "de"... Par exemple, je voudrais trouver les "mais la ville est fondé".

Zetud
0
Zetud Messages postés 3 Date d'inscription mardi 15 décembre 2009 Statut Membre Dernière intervention 15 décembre 2009
15 déc. 2009 à 23:54
Ca marche !

La bonne syntaxe est : (?<!de )la ville est fondé
Tu avais proposé un double "de", mais ta syntaxe (?<!...) était la bonne. Elle n'était pas indiquée dans le site sur lequel je m'auto-forme.

Merci de ton aide.

Zetud
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 131
16 déc. 2009 à 14:04
Bonjour


Quand je lis
«Je cherche les "La ville est fondé" sauf quand cette expression est précédée de "de".»
je vois en pensée
"de""La ville est fondé"
c’est à dire
"deLa ville est fondé"
alors que la RE que tu proposes comporte un blanc et une majuscule qui ne sont pas dans "de""La ville est fondé"

C’est idiot, je te l’accorde, je peux faire un petit effort correctif en pensée.
Mais la lecture des forums demande en permanence ce genre de petits efforts. Ça finit par être pénible
Et puis c’est la ville est fondéE. Avec un E.





Il y a plusieurs choses qui n'allaient pas dans ta RE.
[^\(de\)] la ville est fondé



Un entre-crochets [] représente plusieurs caractères mais 1 seule position. Les crochets permettent de spécifier un ensemble de caractères autorisés pour la position à laquelle l’entre-crochets se trouve dans la RE.

Si on veut répéter l’indication d’autorisation d’un de ces caractères de ce même ensemble pour une succession de positions, il faut mettre un + ou {4} etc

Il faut se représenter [aun#,y] comme [a OU u OU n OU # OU , OU y]





Les caractères spéciaux perdent leur spécialité entre crochets.

Les parenthèses ) et ( n’ont donc pas leur signification de définition d’un groupe quand elle sont dans un entre-crochet.

\ est un caractère d’échappement, aussi bien pour les chaînes que pour les RE.
De plus, dans une RE, \ a une action d’échappement sur un caractère qui le suit quand celui-ci s’y prête, mais si ce n’est pas le cas, \ devient comme transparent , c’est alors comme s’il n’était pas là.
C’est ce qui fait que le code suivant
ch =  'saucissonage sauciss\onage fin'
pat = re.compile('(iss\o)nage')

for m in pat.finditer(ch):
    print m.group(1)

sort un résultat ’isso’.
Le o n’étant pas échappable, \o équivaut à o et seul le premier mot contient isso

La dualité de \ et cette caractéristique sont sources de nombreux problèmes de manipulation et de compréhension de \ ; il y a des choses qui m’échappent (!) encore à son sujet.




Mais on peut quand même dire ce qui suit à propos de la RE que tu avais écrite:

En situation normale dans une RE,
\. représente le seul caractère ’point’, alors qu’un point seul . représente n’importe quel caractère sauf \n.
\( représente une parenthèse, alors que ( toute seule ouvre un groupe

Mais entre crochets, . représente seulement un point et ( représente seulement une parenthèse.

Ainsi
ch =  'saucissonage sauciss(onage fin'
pat = re.compile('([iss(o]{5})nage')

for m in pat.finditer(ch):
    print m.group(1)

sort le résultat iss(o à partir du deuxième mot.



Si maintenant on rajoute un \ dans la RE, le résultat ne change pas:
ch =  'saucissonage sauciss(onage fin'
pat = re.compile('([iss\(o]{5})nage')

for m in pat.finditer(ch):
    print m.group(1)

sort encore iss(o

Pour les raisons suivantes:
- ( n’a pas de caractère spécial entre crochets, il n’est donc pas échappable
- \ par contre conserve son caractère spécial d’échappateur même entre crochets
- or, quand \ est devant un caractère non échappable dans une RE, il est comme transparent





Ta RE [^\(de\)] la ville est fondé est donc équivalente à
[^(de)] la ville est fondé
Compte tenu qu’un entre-crochets représente un seule position et qu’il y a ^, ta RE exprime que tu cherches à éviter les chaînes “ la ville est fondé“ précédées d’une lettre “d“ ou d’une lettre“e“ ou d’une parenthèse gauche“(“ ou droite “)“




On pourrait penser indiquer que ce sont 2 positions que l’on veut préciser devant “ la ville est fondé“ et le faire avec
[^(de)]{2} la ville est fondé

Le problème est qu’on empêche avec une telle RE toutes les possibilités suivantes
“de la ville est fondé“
“ed la ville est fondé“
“ee la ville est fondé“
“dd la ville est fondé“
“d( la ville est fondé“
“(e la ville est fondé“
“)( la ville est fondé“
“d) la ville est fondé“
etc

D’une manière générale, une telle complémentation par crochets empêche non seulement un mot mais toutes les combinaisons des caractères spécifiés entre crochets.

C’est pour cette raison que les “look ahead’ et “look behind “assertins ont été mises en place dans les moteurs de regex.





Peux tu me dire quel est le site que tu utilises ? Savoir quels sites sont les moins bon est m’intéresse.
0