Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
585 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  [python] Regex : substitution

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[python] Regex : substitution

n°786636
chaica
Posté le 05-07-2004 à 09:44:01  profilanswer
 

Salut, je voudrais réaliser une substitution qui modifie le motif trouvé pour le ré-injécter dans la chaîne. Ci dessous le motif constitué d'un point et suivi par une lettre quelconque devrait être remplacé par un point, un espace et la lettre trouvé dans le motif désormais en majuscule.  
 

Code :
  1. #!/usr/bin/python
  2. import re
  3. chaine = 'salut.la.compagnie'
  4. resultat = re.sub( r'(\.[\w])', '. ' + r'\1'[1].upper(), chaine)
  5. print resultat


 
Intuitivement j'ai écrit ça mais ça ne marche pas. Je ne saisis pas trop comment me servir de la référence arrière \1  
Si vous pouvez m'apporter des précision, merci d'avance.


Message édité par chaica le 05-07-2004 à 09:46:27
mood
Publicité
Posté le 05-07-2004 à 09:44:01  profilanswer
 

n°786788
chaica
Posté le 05-07-2004 à 11:50:44  profilanswer
 

up

n°786823
Jubijub
Parce que je le VD bien
Posté le 05-07-2004 à 12:29:56  profilanswer
 

le \1 pointe sur ton truc entre parenthèses...donc ca :  
\.[\w]
 
je comprends pas le [\w]...\w va aussi bien non ?


---------------
Jubi Photos : Flickr - 500px
n°786842
chaica
Posté le 05-07-2004 à 12:54:23  profilanswer
 

Jubijub a écrit :

le \1 pointe sur ton truc entre parenthèses...donc ca :  
\.[\w]


Il pointe plutôt sur la chaine trouvé non? Ce qui m'intéresse c'est d'obtenir la chaîne du motif trouvé pour la ré injecter modifié, d'où le r'\1'[1].upper()
Or apparemment ça ne fonctionne pas comme ça.
 

n°786865
Jubijub
Parce que je le VD bien
Posté le 05-07-2004 à 13:35:47  profilanswer
 

oui bien sur...
 
ta regexp renvoit ca sur ton exemple :  
Match 1: .l
    Subgroups:
    1: .l
Match 2: .c
    Subgroups:
    1: .c
 
après t sur de la syntaxe de ta commande ? (j'y connais rien en python)
 


---------------
Jubi Photos : Flickr - 500px
n°786899
chaica
Posté le 05-07-2004 à 14:26:48  profilanswer
 

Ben non c'est ça le problème, je sais pas exactement ce qu'est le \1 et comment on l'exploite. Sinon le principe j'avais compris :)

n°786913
Jubijub
Parce que je le VD bien
Posté le 05-07-2004 à 14:33:49  profilanswer
 

ben par ex :  
 
\b(\w)\w*\1\b désigne un mot qui commence et finit par la même lettre...
 
mais pour ton exemple je sais pas si le \1 survit à sa regexp...si ca se trouve son contenu se barre dès que tu recrée une deuxième...


---------------
Jubi Photos : Flickr - 500px
n°786932
Kristoph
Posté le 05-07-2004 à 14:39:47  profilanswer
 

Il est temps de sortir : http://kodos.sourceforge.net/ !

n°786976
oliv5
Pourquoi ? Parce que !
Posté le 05-07-2004 à 15:25:12  profilanswer
 


 
peux tu m'écrire un exemple de complet de ce que l'on doit reconnaitre et ce que l'on doit générer ?
J'ai du mal a comprendre.
 
Je te filerais volontier une soluce quand j'aurais compris, si je trouve. A priori ca a pas l'air dur mais avec les regex on sais jamais.

n°787068
chaica
Posté le 05-07-2004 à 16:39:13  profilanswer
 

Oui je vais reprendre :
 
J'ai une ligne:

Code :
  1. chaine = 'salut.les.copains'


 
Si je fais un

Code :
  1. re.sub( r'\.[\w]', 'LOL', chaine )


J'obtiens

salutLOLesLOLopains.


 
On est d'accord jusque là?
 
Moi je veux pas LOL, je veux qu'il me prenne le résultat identifié par mon motif. Premier .l et second .c , et qu'il mette en majuscule le l et le c TOUT CA avec la fonction re.sub. Selon moi il faut utiliser les backreferences mais j'arrive pas à la manipuler. Tout ce que j'arrive à faire c'est  :

Code :
  1. re.sub( r'\.[\w]', r'\1', chaine )


et j'obtiens en sortie

Code :
  1. salut.les.copains


 
Ce qui est logique car il a trouvé .l et .c et les a ré injecté via \1 dans ma chaine.

mood
Publicité
Posté le 05-07-2004 à 16:39:13  profilanswer
 

n°787083
Jubijub
Parce que je le VD bien
Posté le 05-07-2004 à 17:00:16  profilanswer
 

alors c plus un pb de regexp à mon avis...mais de savoir si ta fonction sub est aussi performante que ca...


---------------
Jubi Photos : Flickr - 500px
n°787164
chaica
Posté le 05-07-2004 à 17:32:17  profilanswer
 

C'est bien la question que je me pose :D

n°787232
le_GLu
Posté le 05-07-2004 à 18:47:46  profilanswer
 

bonjour,
 

chaica a écrit :


J'ai une ligne:

Code :
  1. chaine = 'salut.les.copains'
  2. re.sub( r'\.[\w]', r'\1', chaine )


et j'obtiens en sortie

Code :
  1. salut.les.copains


 
Ce qui est logique car il a trouvé .l et .c et les a ré injecté via \1 dans ma chaine.


 
on ne peux pas modifier directement une référence arrière.
mais la fonction re.sub peux utiliser un objet appelable (donc une fonction) comme paramètre de remplacement. donc tu crée une fonction :
 

Code :
  1. chaine = 'salut.les.copains.'
  2. def repl(data):
  3.     return data.group(0)[:-1] + ' ' + data.group(0)[-1].upper()
  4. re.sub(r'(\.[\w])', repl, chaine)
  5. 'salut. Les. Copains.'


 
et voila
 
le_GLu


Message édité par le_GLu le 05-07-2004 à 18:48:32

---------------
Python facile : http://pythonfacile.free.fr/ Les ressources (liens) en français sur Python.
n°787514
chaica
Posté le 06-07-2004 à 00:29:23  profilanswer
 

le_Glu : J'avais lu l'exemple dans le module mais j'ai pas investigué cette piste je sais pas pourquoi. Merci bcp!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  [python] Regex : substitution

 

Sujets relatifs
[MYSQL] Comment appliquer une regex sur un champ ?[DELPHI] faire une regex
Parser un fichier... regex ?Heuuu ! python c'est quoi et c'est utile dans quoi?
fonction pour connexion serveur + regexsubstitution variable vba excel
Python et Imprimante[Résolu][Windows]Kill thread Python
[python] controle textCtrlthread en python
Plus de sujets relatifs à : [python] Regex : substitution


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR