Je me souviens rarement de la syntaxe des expressions régulières. J'utilise beaucoup la fonction findall. A tort je crois.
text = """ a ab ab ab ab c a ab ab ab""" exp = re.compile("a( ((ab)|(c)))+") found = exp.findall(text) for el in found: print(el)
(' c', 'c', 'ab', 'c') (' ab', 'ab', 'ab', '')
Le premier élément de chaque ligne correspond au groupe inclus dans les premières parenthèses qui matche plusieurs sous-parties de la chaîne de caractères mais seule la dernière est conservée.
text = """ a ab ab ab ab c a ab ab ab""" exp = re.compile("a(( ((ab)|(c)))+)") found = exp.findall(text) for el in found: print(el)
(' ab ab ab ab c', ' c', 'c', 'ab', 'c') (' ab ab ab', ' ab', 'ab', 'ab', '')
Si on ajoute des parenthèses autour de l'expression répétées (donc incluant le signe +), on récupère toutes les sous-parties matchant le motif répété par +. Naïvement, j'ai pensé que je les aurais toutes dans des éléments séparés. Mais si l'expression régulières contient n groupes de parenthèses, on récupère des tuples de n éléments. Un autre code permet de récupèrer les positions.
exp = re.compile("a(( ((ab)|(c)))+)") for m in exp.finditer(text): print('%02d-%02d: %s' % (m.start(), m.end(), m.groups()))
01-16: (' c', 'c', 'ab', 'c') 17-27: (' ab', 'ab', 'ab', None)
On se rend compte plus rapidement que quelque chose ne va pas.