Bonjour,
findall() toute seule n’est pas suffisante car il est probable que sopsag cherche des nombres dans des morceaux de chaîne à l’intérieur de chacun desquels les motifs unitaires se succèdent strictement.
Par exemple
	
	| 12
 
 | ch = 'colonie =98=765 charbon=90abcd=9876=345=223 tiroir'
print re.findall("\d+", ch) | 
 va certes sortir
	
	['98', '765', '90', '9876', '345', '223']
 mais ce que veut sopsag est sans doute
	
	['=98=765', '=90', '=9876=345=223']
 De plus,  il veut le morceau dans lequel les nombres se succèdent avec leur enrobage + les nombres individualisés, donc sans doute ceci:
	
	[['=98=765', '98', '765'], ['=90', '90'], ['=9876=345=223', '9876', '345', '223']]
 
Pour répondre à ce double objectif, j’ai finalement trouvé ceci:
	
	| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | ch = 'xyzuv =120=789=907 abcde =9=5=2= huytre'
 
aRE = '=(\d+)'
pat = re.compile(aRE)
print [ [morc]+ pat.findall(morc)
        for morc in ( m.group() for m in re.finditer('(=(\d+))+',ch) ) ]
 
print '-----------------------------'
 
aRE = '=(\d+)'
pat = re.compile(aRE)
print [ [morc]+ pat.findall(morc)
        for morc in re.findall('((?:=(?:\d+))+)',ch) ] | 
 
	
	| 12
 3
 
 | [['=120=789=907', '120', '789', '907'], ['=9=5=2', '9', '5', '2']]
-----------------------------
[['=120=789=907', '120', '789', '907'], ['=9=5=2', '9', '5', '2']] | 
 
Je trouve le deuxième code moins lisible.
On peut mettre ça sous forme de fonction:
	
	| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | ch = 'xyzuv =120=789=907 abcde =9=5=2= huytre'
 
def repeated_chained(aRE,ch):
    if len(re.findall('(?<!\\\\)\(',aRE))==1 and len(re.findall('(?<!\\\\)\)',aRE))==1:
        pat = re.compile(aRE)
        gen_morc =( m.group() for m in re.finditer('('+aRE+')+',ch) )
        return [ [morc]+ pat.findall(morc)
                 for morc in gen_morc ]
 
print repeated_chained('=(\d+)',ch)
 
print '-----------------------------'
 
def repeated_chained(aRE,ch):
    if len(re.findall('(?<!\\\\)\(',aRE))==1 and len(re.findall('(?<!\\\\)\)',aRE))==1:
        pat = re.compile(aRE)
        return [ [morc]+ pat.findall(morc)
                 for morc in re.findall('((?:' + aRE.replace('(','(?:') + ')+)',ch) ]
 
print repeated_chained('=(\d+)',ch) | 
 
Pourvu que la RE unitaire (aRE) ne comporte qu’un seul parenthésage de capture, on peut alors passer ce qu’on veut à une telle fonction:
	
	| 12
 3
 4
 5
 6
 7
 8
 9
 
 | def repeated_chained(aRE,ch):
    if len(re.findall('(?<!\\\\)\(',aRE))==1 and len(re.findall('(?<!\\\\)\)',aRE))==1:
        pat = re.compile(aRE)
        gen_morc =( m.group() for m in re.finditer('('+aRE+')+',ch) )
        return [ [morc]+ pat.findall(morc)
                 for morc in gen_morc ]
 
dh = 'jhgjfd =567+;=7;++=8764;;++=765+=87;YTRE=98;=654;;;+=452++;IOPUY'
print repeated_chained('=(\d+)[;+]+',dh) | 
 
	
	[['=567+;=7;++=8764;;++=765+=87;', '567', '7', '8764', '765', '87'], ['=98;=654;;;+=452++;', '98', '654', '452']]
 
						
					
Partager