3 votes

Comment combiner des groupes dans Python RegEx ?

Comment combiner les groupes (p1 et p2) dans le code suivant ?

import re

txt = "Sab11Mba11"
p1 = "(S(a|b)(a|b))"
p2 = "(M(a|b)(a|b))"
px = "(" + p1 + '|' + p2 + ")"

print(re.findall(p1, txt)) # [('Sab', 'a', 'b')]
print(re.findall(p2, txt)) # [('Mba', 'b', 'a')]
print(re.findall(px, txt)) # [('Sab', 'Sab', 'a', 'b', '', '', ''), ('Mba', '', '', '', 'Mba', 'b', 'a')]

Pouvez-vous m'expliquer pourquoi j'obtiens des chaînes vides et comment faire pour obtenir [('Sab', 'a', 'b'), ('Mba', 'b', 'a')] ?

1voto

Wiktor Stribiżew Points 100073

Les valeurs vides des groupes de capture qui n'ont pas participé au match sont tout de même éditées.

Vous devez supprimer les parenthèses extérieures et filtrer les tuples résultants des valeurs vides :

import re

txt = "Sab11Mba11"
p1 = "(S(a|b)(a|b))"
p2 = "(M(a|b)(a|b))"
px = p1 + '|' + p2
print([tuple(filter(lambda m: m != '', x)) for x in re.findall(px, txt)])
# => [('Sab', 'a', 'b'), ('Mba', 'b', 'a')]

Voir le Démonstration Python .

1voto

JvdV Points 16691

Vous pouvez essayer d'utiliser un groupe de réinitialisation de branche. Cela nécessiterait le module regex de PyPi à la place :

import regex as re

txt = 'Sab11Mba11'
p1 = r'(S(a|b)(a|b))'
p2 = r'(M(a|b)(a|b))'

px = r'(?|' + p1 + '|' + p2 + ')'
print(re.findall(px, txt))

Imprimés :

[('Sab', 'a', 'b'), ('Mba', 'b', 'a')]

Les numéros de groupe seront réutilisés dans les différentes branches d'une réinitialisation.

En général, n'oubliez pas d'utiliser la notation de la chaîne brute lorsque vous travaillez avec des expressions régulières. S , a y b sont des substituts pour d'autres constructions. Notez également que vous n'avez pas besoin de 'px' en soi si vous utilisez la construction f-string. Par exemple :

re.findall(fr'(?|{p1}|{p2})', txt)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X