2010-10-14 4 views
1

Je cherche un moyen Pythonic de simplifier ce code:Nombre de matchs en remplacement regex

fix = re.compile(r'((?<=>\n)(\t){2}(?=<))') 
fixed_output = re.sub(fix, 1*2*' ', fixed_output) 
fix = re.compile(r'((?<=>\n)(\t){3}(?=<))') 
fixed_output = re.sub(fix, 2*2*' ', fixed_output) 
# and so on... 

C'est: s'il y a n caractères de tabulation entre « > » et « < », ils sont remplacé par * (n-1) * 2 * caractères. Cela peut-il être généralisé à une seule expression régulière? En d'autres termes, est-il possible d'écrire une expression régulière qui utilise le nombre de correspondances afin de déterminer la chaîne de remplacement?

Répondre

3

Vous pouvez utiliser une fonction au lieu d'une chaîne de remplacement fixe et prendre le nombre de caractères tabulator adaptés pour générer le remplacement, par exemple:

re.sub(r'((?<=>\n)\t{2,}(?=<))', lambda m: (len(m.group(0))-1)*2*" ", string) 

Ici, le lambda expressionlambda m: (len(m.group(0))-1)*2*" " est utilisé pour remplacer tabulator n caractère par (n -1) · 2 espaces.

+0

Parfait. Merci. – plok

+0

@plok: De rien. – Gumbo