2009-05-22 8 views
1

J'utilise des expressions régulières avec un cadre de python pour pad un numéro spécifique dans un numéro de version:Pad un entier en utilisant une expression régulière

10.2.11

Je veux transformer le deuxième élément à rembourré avec un zéro, il ressemble à ceci:

10.02.11

Mon expression régulière ressemble à ceci:

^(\d{2}\.)(\d{1})([\.].*) 

Si je viens de régurgiter retour les groupes correspondants, j'utiliser cette chaîne:

\1\2\3 

Lorsque j'utilise mon harnais de test d'expression régulière préférée (http://kodos.sourceforge.net/), je ne peux pas à rembourrer le deuxième groupe. J'ai essayé \ 1 \ 20 \ 3, mais cela interprète la deuxième référence comme 20, et non 2.

En raison de la bibliothèque que j'utilise ceci, j'ai besoin que ce soit un doublure. La bibliothèque prend une chaîne d'expression régulière, puis une chaîne pour ce qui devrait être utilisé pour le remplacer par.

Je suppose que j'ai juste besoin d'échapper à la chaîne des groupes correspondants, mais je ne peux pas le comprendre. Merci d'avance pour votre aide.

Répondre

1

Qu'en est-il de supprimer le . de la regex?

^(\d{2})\.(\d{1})[\.](.*) 

remplacer par:

\1.0\2.\3 
+0

J'aime la pensée "hors de la boîte". Merci! –

0

Votre bibliothèque prend-elle en charge named groups? Cela pourrait résoudre votre problème.

+0

non, il ne prend pas en charge les groupes nommés. –

1

Essayez ceci:

(^\d(?=\.)|(?<=\.)\d(?=\.)|(?<=\.)\d$) 

Et remplacer le match par 0\1. Cela fera un nombre d'au moins deux chiffres.

+0

cela ne correspond pas à ma chaîne: 10.2.11 –

+0

Cela fonctionne pour moi: 're.compile (r" (^ \ d (? = \.) | (? <= \.) \ D (? = \.) | (? <= \.) \ d $) "). sub (r" 0 \ 1 "," 10.2.11 ")'. – Gumbo

3

Que diriez-vous d'une approche complètement différente?

nums = version_string.split('.') 
print ".".join("%02d" % int(n) for n in nums) 
+0

Je me sens obligé de remettre en question de simples solutions Python sans regex. (Ce serait probablement une histoire différente si c'était Perl.) –

Questions connexes