Bonjour tout le monde,


Des sequences sont definies par des chaines de caracteres : 'abc1-3,7,10-14x2@@ext' est la definition textuelle de

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
abc01ext
abc02ext
abc03ext
abc07ext
abc10ext
abc12ext
abc14ext
Ces chaines sont de la forme [prefix][numeros][padding][suffix]

Le nombre d'arobase definit le padding des index. Les x2, x3... le pas entre chaque index.

J'utilise l'expression reguliere suivante pour separer mes chaines en 4 parties :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
r'''(?P<indices>(?:(?:-?[\d]+--?[\d]+(?:x\d+)?|-?[\d]+),?)*)
    (?P<padding>(?(indices)@*|@+))'''
J'utilise a cet effet la function split du module re de python.

Ca fonctionne bien avec de chaines comme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
3
3@@
@@
-10--6
-10--6x2
-10--6x2@@
-10--6x2,-4,-1-1@@
p.-10--6x2,-4,-1-1@@
p.-10--6x2,-4,-1-1@@.s
Cependant si ma chaine devient compliquee, ca marche beaucoup moins bien :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
'/tmp  files/foo2_v2,x2.0001.2-10#.-2.3-11@@._-10--6x2,-4,-1-1@@_bar-10--6x2,-4,-1-1@@.tar.bz'
Dans ce cas la, le premier "2" est matche par le group (?<indices>), alors que c'est le dernier -10--6x2,-4,-1-1@@ qui devrait etre matche.

J'essais d'eviter au maximum la manipulation des chaines de caracteres en dehors du traitement effectue par les expressions regulieres.

Donc :
- comment s'assurer que mon expression reguliere va matcher la derniere occurence ?
- peut specifier une expression reguliere qui me permettrait de matcher directement le prefix et le suffixe sans passer par la function split ? Quelque chose comme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
(?P<prefix>.*?)
(?P<indices>(?:(?:-?[\d]+--?[\d]+(?:x\d+)?|-?[\d]+),?)*)
(?P<padding>(?(indices)@*|@+)
(?P<suffix>.*)
Bien evidement l'exemple ne fonctionne pas, le groupe (?P<prefix>.*) retourne une chaine vide.

Merci beaucoup pour votre aide !