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
1 2
| 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:
1 2 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) ] |
1 2 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:
1 2 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:
1 2 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