2010-10-01 2 views
0

I ont des noms à jetons (chaînes), avec les jetons séparés par des traits de soulignement, qui contiendra toujours un jeton « latéral », par la valeur de M, L ou R.valeurs de jeton pour échanger dans une chaîne par expression rationnelle

La présence de cette valeur est garantie unique (pas de répétitions ou de dangers que d'autres jetons puissent avoir des valeurs similaires). Dans l'exemple:

foo_M_bar_type 
foo_R_bar_type 
foo_L_bar_type 

Je voudrais, en une seule regex, d'échanger L pour R et vice versa chaque fois trouvé, et M à laisser intacte. IE ci-dessus deviendrait:

foo_M_bar_type 
foo_L_bar_type 
foo_R_bar_type 

lorsqu'il est poussé par cette expression idéale.

C'était ce que je pensais être un exercice de 10 minutes tout en écrivant quelques trucs simples, que je ne pouvais pas vraiment craquer aussi concis que je le voulais.

Le problème lui-même était bien sûr trivial à résoudre avec une condition qui change le modèle, mais j'aimerais beaucoup l'aider à le faire dans un seul re.sub() Bien sûr, toute matière à réflexion est toujours la bienvenue, mais ceci étant un exercice intellectuel que moi et quelques collègues avons échoué, j'adorerais le voir craqué de cette façon.

Et oui, je suis pleinement conscient qu'il ne pourrait pas être considéré comme très Pythonic, ni idéal, pour résoudre le problème avec une expression régulière, mais l'humour me :) s'il vous plaît

Merci à l'avance

Répondre

3

Cette réponse [ab] utilise la fonction de remplacement:

>>> s = "foo_M_bar_type foo_R_bar_type foo_L_bar_type" 
>>> import re 
>>> re.sub("_[LR]_", lambda m: {'_L_':'_R_','_R_':'_L_'}[m.group()], s) 
'foo_M_bar_type foo_L_bar_type foo_R_bar_type' 
>>> 
Questions connexes