XD blog

blog page

regular expression


2014-12-02 Petites subtilités avec les expressions régulières en Python

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.


Xavier Dupré