[python] Regex : substitution

Regex : substitution [python] - Python - Programmation

Marsh Posté le 05-07-2004 à 09:44:01    

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
Reply

Marsh Posté le 05-07-2004 à 09:44:01   

Reply

Marsh Posté le 05-07-2004 à 11:50:44    

up

Reply

Marsh Posté le 05-07-2004 à 12:29:56    

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
Reply

Marsh Posté le 05-07-2004 à 12:54:23    

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.
 

Reply

Marsh Posté le 05-07-2004 à 13:35:47    

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
Reply

Marsh Posté le 05-07-2004 à 14:26:48    

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 :)

Reply

Marsh Posté le 05-07-2004 à 14:33:49    

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
Reply

Marsh Posté le 05-07-2004 à 14:39:47    

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

Reply

Marsh Posté le 05-07-2004 à 15:25:12    


 
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.

Reply

Marsh Posté le 05-07-2004 à 16:39:13    

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.

Reply

Marsh Posté le 05-07-2004 à 16:39:13   

Reply

Marsh Posté le 05-07-2004 à 17:00:16    

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
Reply

Marsh Posté le 05-07-2004 à 17:32:17    

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

Reply

Marsh Posté le 05-07-2004 à 18:47:46    

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.
Reply

Marsh Posté le 06-07-2004 à 00:29:23    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed